• R/O
  • HTTP
  • SSH
  • HTTPS

コミット

タグ
未設定

よく使われているワード(クリックで追加)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

Go で書き直した Ikemen


コミットメタ情報

リビジョン40bc805045a363253ecd91cf7e74dae5e1fcb3a7 (tree)
日時2019-04-23 22:50:45
作者neatunsou <sisiy4excite@gmai...>
コミッターneatunsou

ログメッセージ

Map(連想配列)機能を追加

変更サマリ

差分

--- a/src/bytecode.go
+++ b/src/bytecode.go
@@ -359,6 +359,7 @@ const (
359359 OC_ex_timemod
360360 OC_ex_majorversion
361361 OC_ex_drawpalno
362+ OC_ex_maparray
362363 OC_ex_gethitvar_animtype
363364 OC_ex_gethitvar_airtype
364365 OC_ex_gethitvar_groundtype
@@ -1557,6 +1558,9 @@ func (be BytecodeExp) run_ex(c *Char, i *int, oc *Char) {
15571558 sys.bcStack.PushI(int32(c.gi().ver[0]))
15581559 case OC_ex_drawpalno:
15591560 sys.bcStack.PushI(c.gi().drawpalno)
1561+ case OC_ex_maparray:
1562+ sys.bcStack.PushI(c.gi().mapArray[sys.stringPool[sys.workingState.playerNo].List[*(*int32)(unsafe.Pointer(&be[*i]))]])
1563+ *i += 4
15601564 default:
15611565 sys.errLog.Printf("%v\n", be[*i-1])
15621566 c.panic()
@@ -5700,6 +5704,37 @@ func (sc zoom) Run(c *Char, _ []int32) bool {
57005704 return false
57015705 }
57025706
5707+type mapSet StateControllerBase
5708+
5709+const (
5710+ mapSet_mapArray byte = iota
5711+ mapSet_value
5712+ mapSet_redirectid
5713+)
5714+
5715+func (sc mapSet) Run(c *Char, _ []int32) bool {
5716+ crun := c
5717+ var s string
5718+ var value int32
5719+ StateControllerBase(sc).run(c, func(id byte, exp []BytecodeExp) bool {
5720+ switch id {
5721+ case mapSet_mapArray:
5722+ s = string(*(*[]byte)(unsafe.Pointer(&exp[0])))
5723+ case mapSet_value:
5724+ value = exp[0].evalI(c)
5725+ case mapSet_redirectid:
5726+ if rid := sys.playerID(exp[0].evalI(c)); rid != nil {
5727+ crun = rid
5728+ } else {
5729+ return false
5730+ }
5731+ }
5732+ return true
5733+ })
5734+ crun.mapSet(s, value)
5735+ return false
5736+}
5737+
57035738 type StateBytecode struct {
57045739 stateType StateType
57055740 moveType MoveType
--- a/src/char.go
+++ b/src/char.go
@@ -1369,6 +1369,7 @@ type CharGlobalInfo struct {
13691369 unhittable int32
13701370 quotes [MaxQuotes]string
13711371 portraitscale float32
1372+ mapArray map[string]int32
13721373 }
13731374
13741375 func (cgi *CharGlobalInfo) clearPCTime() {
@@ -1636,13 +1637,14 @@ func (c *Char) load(def string) error {
16361637 for i := range gi.palkeymap {
16371638 gi.palkeymap[i] = int32(i)
16381639 }
1640+ gi.mapArray = make(map[string]int32)
16391641 str, err := LoadText(def)
16401642 if err != nil {
16411643 return err
16421644 }
16431645 lines, i := SplitAndTrim(str, "\n"), 0
16441646 cns, sprite, anim, sound := "", "", "", ""
1645- info, files, keymap := true, true, true
1647+ info, files, keymap, mapArray := true, true, true, true
16461648 c.localcoord = 320
16471649 c.localscl = 1
16481650 for i < len(lines) {
@@ -1689,6 +1691,15 @@ func (c *Char) load(def string) error {
16891691 }
16901692 }
16911693 }
1694+ case "map":
1695+ if mapArray {
1696+ mapArray = false
1697+ for key, value := range is {
1698+ keylow := strings.ToLower(key)
1699+ intValue := Atoi(value)
1700+ gi.mapArray[keylow] = intValue
1701+ }
1702+ }
16921703 }
16931704 }
16941705 if err := LoadFile(&cns, def, func(filename string) error {
@@ -3812,6 +3823,13 @@ func (c *Char) forceRemapPal(pfx *PalFX, dst [2]int32) {
38123823 pfx.remap[i] = di
38133824 }
38143825 }
3826+func (c *Char) mapSet(s string, Value int32) {
3827+ if s == "" {
3828+ return
3829+ }
3830+ key := strings.ToLower(s)
3831+ c.gi().mapArray[key] = Value
3832+}
38153833 func (c *Char) inGuardState() bool {
38163834 return c.ss.no == 120 || (c.ss.no >= 130 && c.ss.no <= 132) ||
38173835 c.ss.no == 140 || (c.ss.no >= 150 && c.ss.no <= 155)
--- a/src/compiler.go
+++ b/src/compiler.go
@@ -124,6 +124,7 @@ func newCompiler() *Compiler {
124124 "offset": c.offset,
125125 "victoryquote": c.victoryQuote,
126126 "zoom": c.zoom,
127+ "mapset": c.mapSet,
127128 "forcefeedback": c.null,
128129 "null": c.null,
129130 }
@@ -2022,6 +2023,17 @@ func (c *Compiler) expValue(out *BytecodeExp, in *string,
20222023 out.append(OC_ex_, OC_ex_majorversion)
20232024 case "drawpalno":
20242025 out.append(OC_ex_, OC_ex_drawpalno)
2026+ case "map":
2027+ if err := c.kakkohiraku(in); err != nil {
2028+ return bvNone(), err
2029+ }
2030+ out.append(OC_ex_)
2031+ out.appendI32Op(OC_ex_maparray, int32(sys.stringPool[c.playerNo].Add(
2032+ strings.ToLower(c.token))))
2033+ c.token = c.tokenizer(in)
2034+ if err := c.kakkotojiru(); err != nil {
2035+ return bvNone(), err
2036+ }
20252037 case "=", "!=", ">", ">=", "<", "<=", "&", "&&", "^", "^^", "|", "||",
20262038 "+", "*", "**", "/", "%":
20272039 if !sys.ignoreMostErrors || len(c.maeOp) > 0 {
@@ -6204,6 +6216,32 @@ func (c *Compiler) zoom(is IniSection, sc *StateControllerBase,
62046216 })
62056217 return *ret, err
62066218 }
6219+
6220+func (c *Compiler) mapSet(is IniSection, sc *StateControllerBase,
6221+ _ int8) (StateController, error) {
6222+ ret, err := (*mapSet)(sc), c.stateSec(is, func() error {
6223+ if err := c.paramValue(is, sc, "redirectid",
6224+ mapSet_redirectid, VT_Int, 1, false); err != nil {
6225+ return err
6226+ }
6227+ if err := c.stateParam(is, "map", func(data string) error {
6228+ if len(data) < 2 || data[0] != '"' || data[len(data)-1] != '"' {
6229+ return Error("\"で囲まれていません")
6230+ }
6231+ sc.add(mapSet_mapArray, sc.beToExp(BytecodeExp(data[1:len(data)-1])))
6232+ return nil
6233+ }); err != nil {
6234+ return err
6235+ }
6236+ if err := c.paramValue(is, sc, "value",
6237+ mapSet_value, VT_Int, 1, false); err != nil {
6238+ return err
6239+ }
6240+ return nil
6241+ })
6242+ return *ret, err
6243+}
6244+
62076245 func (c *Compiler) null(is IniSection, sc *StateControllerBase,
62086246 _ int8) (StateController, error) {
62096247 return nullStateController, nil