Go で書き直した Ikemen
Revisão | 40bc805045a363253ecd91cf7e74dae5e1fcb3a7 (tree) |
---|---|
Hora | 2019-04-23 22:50:45 |
Autor | neatunsou <sisiy4excite@gmai...> |
Commiter | neatunsou |
Map(連想配列)機能を追加
@@ -359,6 +359,7 @@ const ( | ||
359 | 359 | OC_ex_timemod |
360 | 360 | OC_ex_majorversion |
361 | 361 | OC_ex_drawpalno |
362 | + OC_ex_maparray | |
362 | 363 | OC_ex_gethitvar_animtype |
363 | 364 | OC_ex_gethitvar_airtype |
364 | 365 | OC_ex_gethitvar_groundtype |
@@ -1557,6 +1558,9 @@ func (be BytecodeExp) run_ex(c *Char, i *int, oc *Char) { | ||
1557 | 1558 | sys.bcStack.PushI(int32(c.gi().ver[0])) |
1558 | 1559 | case OC_ex_drawpalno: |
1559 | 1560 | 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 | |
1560 | 1564 | default: |
1561 | 1565 | sys.errLog.Printf("%v\n", be[*i-1]) |
1562 | 1566 | c.panic() |
@@ -5700,6 +5704,37 @@ func (sc zoom) Run(c *Char, _ []int32) bool { | ||
5700 | 5704 | return false |
5701 | 5705 | } |
5702 | 5706 | |
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 | + | |
5703 | 5738 | type StateBytecode struct { |
5704 | 5739 | stateType StateType |
5705 | 5740 | moveType MoveType |
@@ -1369,6 +1369,7 @@ type CharGlobalInfo struct { | ||
1369 | 1369 | unhittable int32 |
1370 | 1370 | quotes [MaxQuotes]string |
1371 | 1371 | portraitscale float32 |
1372 | + mapArray map[string]int32 | |
1372 | 1373 | } |
1373 | 1374 | |
1374 | 1375 | func (cgi *CharGlobalInfo) clearPCTime() { |
@@ -1636,13 +1637,14 @@ func (c *Char) load(def string) error { | ||
1636 | 1637 | for i := range gi.palkeymap { |
1637 | 1638 | gi.palkeymap[i] = int32(i) |
1638 | 1639 | } |
1640 | + gi.mapArray = make(map[string]int32) | |
1639 | 1641 | str, err := LoadText(def) |
1640 | 1642 | if err != nil { |
1641 | 1643 | return err |
1642 | 1644 | } |
1643 | 1645 | lines, i := SplitAndTrim(str, "\n"), 0 |
1644 | 1646 | cns, sprite, anim, sound := "", "", "", "" |
1645 | - info, files, keymap := true, true, true | |
1647 | + info, files, keymap, mapArray := true, true, true, true | |
1646 | 1648 | c.localcoord = 320 |
1647 | 1649 | c.localscl = 1 |
1648 | 1650 | for i < len(lines) { |
@@ -1689,6 +1691,15 @@ func (c *Char) load(def string) error { | ||
1689 | 1691 | } |
1690 | 1692 | } |
1691 | 1693 | } |
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 | + } | |
1692 | 1703 | } |
1693 | 1704 | } |
1694 | 1705 | if err := LoadFile(&cns, def, func(filename string) error { |
@@ -3812,6 +3823,13 @@ func (c *Char) forceRemapPal(pfx *PalFX, dst [2]int32) { | ||
3812 | 3823 | pfx.remap[i] = di |
3813 | 3824 | } |
3814 | 3825 | } |
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 | +} | |
3815 | 3833 | func (c *Char) inGuardState() bool { |
3816 | 3834 | return c.ss.no == 120 || (c.ss.no >= 130 && c.ss.no <= 132) || |
3817 | 3835 | c.ss.no == 140 || (c.ss.no >= 150 && c.ss.no <= 155) |
@@ -124,6 +124,7 @@ func newCompiler() *Compiler { | ||
124 | 124 | "offset": c.offset, |
125 | 125 | "victoryquote": c.victoryQuote, |
126 | 126 | "zoom": c.zoom, |
127 | + "mapset": c.mapSet, | |
127 | 128 | "forcefeedback": c.null, |
128 | 129 | "null": c.null, |
129 | 130 | } |
@@ -2022,6 +2023,17 @@ func (c *Compiler) expValue(out *BytecodeExp, in *string, | ||
2022 | 2023 | out.append(OC_ex_, OC_ex_majorversion) |
2023 | 2024 | case "drawpalno": |
2024 | 2025 | 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 | + } | |
2025 | 2037 | case "=", "!=", ">", ">=", "<", "<=", "&", "&&", "^", "^^", "|", "||", |
2026 | 2038 | "+", "*", "**", "/", "%": |
2027 | 2039 | if !sys.ignoreMostErrors || len(c.maeOp) > 0 { |
@@ -6204,6 +6216,32 @@ func (c *Compiler) zoom(is IniSection, sc *StateControllerBase, | ||
6204 | 6216 | }) |
6205 | 6217 | return *ret, err |
6206 | 6218 | } |
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 | + | |
6207 | 6245 | func (c *Compiler) null(is IniSection, sc *StateControllerBase, |
6208 | 6246 | _ int8) (StateController, error) { |
6209 | 6247 | return nullStateController, nil |