Skip to content

Commit bcf03f9

Browse files
authored
Merge pull request #2557 from RakieI/newstuff
fix: anim/spritePlayerNo crashing unsafely and not working for explods
2 parents 3630926 + affb206 commit bcf03f9

2 files changed

Lines changed: 40 additions & 34 deletions

File tree

src/bytecode.go

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4187,6 +4187,18 @@ func getRedirectedChar(c *Char, sc StateControllerBase, redirectID byte, scname
41874187
return crun
41884188
}
41894189

4190+
func validatePlayerNo(c *Char, pn int, pname, scname string) bool {
4191+
valid := pn >= 0 &&
4192+
pn < len(sys.chars) &&
4193+
len(sys.chars[pn]) > 0 &&
4194+
sys.chars[pn][0] != nil
4195+
if !valid {
4196+
sys.appendToConsole(c.warn() + fmt.Sprintf("Invalid %s for %s: %v", pname, scname, pn+1))
4197+
return false
4198+
}
4199+
return true
4200+
}
4201+
41904202
type stateDef StateControllerBase
41914203

41924204
const (
@@ -4851,16 +4863,14 @@ func (sc changeAnim) Run(c *Char, _ []int32) bool {
48514863
}
48524864
case changeAnim_animplayerno:
48534865
pn := int(exp[0].evalI(c)) - 1
4854-
if pn < 0 || sys.chars[pn][0] == nil {
4855-
return false
4866+
if validatePlayerNo(c, pn, "animPlayerNo", "changeAnim") {
4867+
animPN = pn
48564868
}
4857-
animPN = pn
48584869
case changeAnim_spriteplayerno:
48594870
pn := int(exp[0].evalI(c)) - 1
4860-
if pn < 0 || sys.chars[pn][0] == nil {
4861-
return false
4871+
if validatePlayerNo(c, pn, "spritePlayerNo", "changeAnim") {
4872+
spritePN = pn
48624873
}
4863-
spritePN = pn
48644874
case changeAnim_readplayerid:
48654875
if read := sys.playerID(exp[0].evalI(c)); read != nil {
48664876
rpid = read.playerNo
@@ -5569,16 +5579,14 @@ func (sc explod) Run(c *Char, _ []int32) bool {
55695579
e.setAnim(e.animNo, apn, spn, ffx)
55705580
case explod_animplayerno:
55715581
pn := int(exp[0].evalI(c)) - 1
5572-
if pn < 0 || sys.chars[pn][0] == nil {
5573-
return false
5582+
if validatePlayerNo(c, pn, "animPlayerNo", "Explod") {
5583+
animPN = pn
55745584
}
5575-
animPN = pn
55765585
case explod_spriteplayerno:
55775586
pn := int(exp[0].evalI(c)) - 1
5578-
if pn < 0 || sys.chars[pn][0] == nil {
5579-
return false
5587+
if validatePlayerNo(c, pn, "spritePlayerNo", "Explod") {
5588+
spritePN = pn
55805589
}
5581-
spritePN = pn
55825590
case explod_ownpal:
55835591
e.ownpal = exp[0].evalB(c)
55845592
case explod_remappal:
@@ -5915,16 +5923,14 @@ func (sc modifyExplod) Run(c *Char, _ []int32) bool {
59155923
}
59165924
case explod_animplayerno:
59175925
pn := int(exp[0].evalI(c)) - 1
5918-
if pn < 0 || sys.chars[pn][0] == nil {
5919-
return false
5926+
if validatePlayerNo(c, pn, "animPlayerNo", "modifyExplod") {
5927+
animPN = pn
59205928
}
5921-
animPN = pn
59225929
case explod_spriteplayerno:
59235930
pn := int(exp[0].evalI(c)) - 1
5924-
if pn < 0 || sys.chars[pn][0] == nil {
5925-
return false
5931+
if validatePlayerNo(c, pn, "spritePlayerNo", "modifyExplod") {
5932+
spritePN = pn
59265933
}
5927-
spritePN = pn
59285934
case explod_remappal:
59295935
rp[0] = exp[0].evalI(c)
59305936
if len(exp) > 1 {

src/compiler_functions.go

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -976,6 +976,14 @@ func (c *Compiler) explod(is IniSection, sc *StateControllerBase,
976976
explod_redirectid, VT_Int, 1, false); err != nil {
977977
return err
978978
}
979+
if err := c.paramValue(is, sc, "animplayerno",
980+
explod_animplayerno, VT_Int, 1, false); err != nil {
981+
return err
982+
}
983+
if err := c.paramValue(is, sc, "spriteplayerno",
984+
explod_spriteplayerno, VT_Int, 1, false); err != nil {
985+
return err
986+
}
979987
if err := c.stateParam(is, "anim", false, func(data string) error {
980988
prefix := c.getDataPrefix(&data, false)
981989
return c.scAdd(sc, explod_anim, data, VT_Int, 1,
@@ -998,14 +1006,6 @@ func (c *Compiler) explod(is IniSection, sc *StateControllerBase,
9981006
explod_animelemtime, VT_Int, 1, false); err != nil {
9991007
return err
10001008
}
1001-
if err := c.paramValue(is, sc, "animplayerno",
1002-
explod_animplayerno, VT_Int, 1, false); err != nil {
1003-
return err
1004-
}
1005-
if err := c.paramValue(is, sc, "spriteplayerno",
1006-
explod_spriteplayerno, VT_Int, 1, false); err != nil {
1007-
return err
1008-
}
10091009
if err := c.paramValue(is, sc, "animfreeze",
10101010
explod_animfreeze, VT_Bool, 1, false); err != nil {
10111011
return err
@@ -1055,6 +1055,14 @@ func (c *Compiler) modifyExplod(is IniSection, sc *StateControllerBase,
10551055
if err := c.explodSub(is, sc); err != nil {
10561056
return err
10571057
}
1058+
if err := c.paramValue(is, sc, "animplayerno",
1059+
explod_animplayerno, VT_Int, 1, false); err != nil {
1060+
return err
1061+
}
1062+
if err := c.paramValue(is, sc, "spriteplayerno",
1063+
explod_spriteplayerno, VT_Int, 1, false); err != nil {
1064+
return err
1065+
}
10581066
if err := c.stateParam(is, "anim", false, func(data string) error {
10591067
prefix := c.getDataPrefix(&data, false)
10601068
return c.scAdd(sc, explod_anim, data, VT_Int, 1,
@@ -1070,14 +1078,6 @@ func (c *Compiler) modifyExplod(is IniSection, sc *StateControllerBase,
10701078
explod_animelemtime, VT_Int, 1, false); err != nil {
10711079
return err
10721080
}
1073-
if err := c.paramValue(is, sc, "animplayerno",
1074-
explod_animplayerno, VT_Int, 1, false); err != nil {
1075-
return err
1076-
}
1077-
if err := c.paramValue(is, sc, "spriteplayerno",
1078-
explod_spriteplayerno, VT_Int, 1, false); err != nil {
1079-
return err
1080-
}
10811081
if err := c.paramValue(is, sc, "animfreeze",
10821082
explod_animfreeze, VT_Bool, 1, false); err != nil {
10831083
return err

0 commit comments

Comments
 (0)