• R/O
  • HTTP
  • SSH
  • HTTPS

コミット

タグ
未設定

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

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

Go で書き直した Ikemen


コミットメタ情報

リビジョン5cc1500ce3e29246a309400d79ba09fbea43cd91 (tree)
日時2019-06-16 10:11:54
作者neatunsou <sisiy4excite@gmai...>
コミッターneatunsou

ログメッセージ

Stagefrontedge、Stagebackedgeを追加
Projectileにprojangleを追加
targetにbindしたフレーム中にDestroyselfをするとbind先を5050に戻す仕様を無効にした
BindToTargetのlocalcoord対応を修正
Projectileに足場を作るためのplatform機能を追加。まだ作りかけなので使用非推奨

変更サマリ

差分

--- a/src/bytecode.go
+++ b/src/bytecode.go
@@ -361,6 +361,9 @@ const (
361361 OC_ex_drawpalno
362362 OC_ex_maparray
363363 OC_ex_selfstatenoexist
364+ OC_ex_groundangle
365+ OC_ex_stagefrontedge
366+ OC_ex_stagebackedge
364367 OC_ex_gethitvar_animtype
365368 OC_ex_gethitvar_airtype
366369 OC_ex_gethitvar_groundtype
@@ -1082,7 +1085,7 @@ func (be BytecodeExp) run(c *Char) BytecodeValue {
10821085 case OC_pos_x:
10831086 sys.bcStack.PushF((c.pos[0]*c.localscl/oc.localscl - sys.cam.Pos[0]/oc.localscl))
10841087 case OC_pos_y:
1085- sys.bcStack.PushF(c.pos[1] * c.localscl / oc.localscl)
1088+ sys.bcStack.PushF((c.pos[1] - c.platformPosY) * c.localscl / oc.localscl)
10861089 case OC_power:
10871090 sys.bcStack.PushI(c.getPower())
10881091 case OC_powermax:
@@ -1564,6 +1567,12 @@ func (be BytecodeExp) run_ex(c *Char, i *int, oc *Char) {
15641567 *i += 4
15651568 case OC_ex_selfstatenoexist:
15661569 *sys.bcStack.Top() = c.selfStatenoExist(*sys.bcStack.Top())
1570+ case OC_ex_groundangle:
1571+ sys.bcStack.PushF(c.groundAngle)
1572+ case OC_ex_stagefrontedge:
1573+ sys.bcStack.PushF(c.stageFrontEdge())
1574+ case OC_ex_stagebackedge:
1575+ sys.bcStack.PushF(c.stageBackEdge())
15671576 default:
15681577 sys.errLog.Printf("%v\n", be[*i-1])
15691578 c.panic()
@@ -2820,7 +2829,7 @@ func (sc posSet) Run(c *Char, _ []int32) bool {
28202829 case posSet_x:
28212830 crun.setX(sys.cam.Pos[0]/crun.localscl + exp[0].evalF(c)*lclscround)
28222831 case posSet_y:
2823- crun.setY(exp[0].evalF(c) * lclscround)
2832+ crun.setY(exp[0].evalF(c)*lclscround + crun.platformPosY)
28242833 case posSet_z:
28252834 exp[0].run(c)
28262835 case posSet_redirectid:
@@ -3593,6 +3602,7 @@ const (
35933602 projectile_remvelocity
35943603 projectile_accel
35953604 projectile_projscale
3605+ projectile_projangle
35963606 projectile_offset
35973607 projectile_projsprpriority
35983608 projectile_projstagebound
@@ -3603,6 +3613,11 @@ const (
36033613 projectile_pausemovetime
36043614 projectile_ownpal
36053615 projectile_remappal
3616+ projectile_platform
3617+ projectile_platformwidth
3618+ projectile_platformheight
3619+ projectile_platformfence
3620+ projectile_platformangle
36063621 projectile_redirectid
36073622 )
36083623
@@ -3691,6 +3706,8 @@ func (sc projectile) Run(c *Char, _ []int32) bool {
36913706 if len(exp) > 1 {
36923707 p.scale[1] = exp[1].evalF(c)
36933708 }
3709+ case projectile_projangle:
3710+ p.angle = exp[0].evalF(c)
36943711 case projectile_offset:
36953712 x = exp[0].evalF(c) * lclscround
36963713 if len(exp) > 1 {
@@ -3720,6 +3737,22 @@ func (sc projectile) Run(c *Char, _ []int32) bool {
37203737 if len(exp) > 1 {
37213738 rp[1] = exp[1].evalI(c)
37223739 }
3740+ case projectile_platform:
3741+ p.platform = exp[0].evalB(c)
3742+ case projectile_platformwidth:
3743+ p.platformWidth[0] = exp[0].evalF(c) * lclscround
3744+ if len(exp) > 1 {
3745+ p.platformWidth[1] = exp[1].evalF(c) * lclscround
3746+ }
3747+ case projectile_platformheight:
3748+ p.platformHeight[0] = exp[0].evalF(c) * lclscround
3749+ if len(exp) > 1 {
3750+ p.platformHeight[1] = exp[1].evalF(c) * lclscround
3751+ }
3752+ case projectile_platformangle:
3753+ p.platformAngle = exp[0].evalF(c)
3754+ case projectile_platformfence:
3755+ p.platformFence = exp[0].evalB(c)
37233756 default:
37243757 if !hitDef(sc).runSub(c, &p.hitdef, id, exp) {
37253758 afterImage(sc).runSub(c, &p.aimg, id, exp)
--- a/src/char.go
+++ b/src/char.go
@@ -1077,6 +1077,7 @@ type Projectile struct {
10771077 remanim int32
10781078 cancelanim int32
10791079 scale [2]float32
1080+ angle float32
10801081 clsnScale [2]float32
10811082 remove bool
10821083 removetime int32
@@ -1106,6 +1107,11 @@ type Projectile struct {
11061107 palfx *PalFX
11071108 localscl float32
11081109 parentAttackmul float32
1110+ platform bool
1111+ platformWidth [2]float32
1112+ platformHeight [2]float32
1113+ platformAngle float32
1114+ platformFence bool
11091115 }
11101116
11111117 func newProjectile() *Projectile {
@@ -1118,7 +1124,7 @@ func (p *Projectile) clear() {
11181124 scale: [...]float32{1, 1}, clsnScale: [...]float32{1, 1}, remove: true, localscl: 1,
11191125 removetime: -1, velmul: [...]float32{1, 1}, hits: 1, priority: 1,
11201126 prioritypoint: 1, sprpriority: 3, edgebound: 40, stagebound: 40,
1121- heightbound: [...]int32{-240, 1}, facing: 1, aimg: *newAfterImage()}
1127+ heightbound: [...]int32{-240, 1}, facing: 1, aimg: *newAfterImage(), platformFence: true}
11221128 p.hitdef.clear()
11231129 }
11241130 func (p *Projectile) setPos(pos [2]float32) {
@@ -1321,7 +1327,7 @@ func (p *Projectile) cueDraw(oldVer bool, playerNo int) {
13211327 if p.ani != nil {
13221328 sd := &SprData{p.ani, p.palfx, [...]float32{p.pos[0] * p.localscl, p.pos[1] * p.localscl},
13231329 [...]float32{p.facing * p.scale[0] * p.localscl, p.scale[1] * p.localscl}, [2]int32{-1},
1324- p.sprpriority, 0, 0, 0, [...]float32{1, 1}, false, playerNo == sys.superplayer,
1330+ p.sprpriority, p.facing * p.angle, 0, 0, [...]float32{1, 1}, false, playerNo == sys.superplayer,
13251331 sys.cgi[playerNo].ver[0] != 1, p.facing}
13261332 p.aimg.recAndCue(sd, sys.tickNextFrame() && notpause)
13271333 sys.sprites.add(sd,
@@ -1502,6 +1508,8 @@ type Char struct {
15021508 cpucmd int32
15031509 attackDist float32
15041510 offset [2]float32
1511+ platformPosY float32
1512+ groundAngle float32
15051513 stchtmp bool
15061514 inguarddist bool
15071515 pushed bool
@@ -2581,6 +2589,18 @@ func (c *Char) selfStatenoExist(stateno BytecodeValue) BytecodeValue {
25812589 _, ok := c.gi().states[stateno.ToI()]
25822590 return BytecodeBool(ok)
25832591 }
2592+func (c *Char) stageFrontEdge() float32 {
2593+ if c.facing > 0 {
2594+ return sys.cam.XMax/c.localscl - c.pos[0]
2595+ }
2596+ return c.pos[0] - sys.cam.XMin/c.localscl
2597+}
2598+func (c *Char) stageBackEdge() float32 {
2599+ if c.facing < 0 {
2600+ return sys.cam.XMax/c.localscl - c.pos[0]
2601+ }
2602+ return c.pos[0] - sys.cam.XMin/c.localscl
2603+}
25842604 func (c *Char) time() int32 {
25852605 return c.ss.time
25862606 }
@@ -3425,17 +3445,17 @@ func (c *Char) bindToTarget(tar []int32, time int32, x, y float32, hmf HMF) {
34253445 if t := sys.playerID(tar[0]); t != nil {
34263446 switch hmf {
34273447 case HMF_M:
3428- x += float32(t.size.mid.pos[0])
3429- y += float32(t.size.mid.pos[1])
3448+ x += t.size.mid.pos[0] * (320 / float32(t.localcoord)) / c.localscl
3449+ y += t.size.mid.pos[1] * (320 / float32(t.localcoord)) / c.localscl
34303450 case HMF_H:
3431- x += float32(t.size.head.pos[0])
3432- y += float32(t.size.head.pos[1])
3451+ x += t.size.head.pos[0] * (320 / float32(t.localcoord)) / c.localscl
3452+ y += t.size.head.pos[1] * (320 / float32(t.localcoord)) / c.localscl
34333453 }
34343454 if !math.IsNaN(float64(x)) {
3435- c.setX(t.pos[0] + t.facing*x)
3455+ c.setX(t.pos[0]*t.localscl/c.localscl + t.facing*x)
34363456 }
34373457 if !math.IsNaN(float64(y)) {
3438- c.setY(t.pos[1] + y)
3458+ c.setY(t.pos[1]*t.localscl/c.localscl + y)
34393459 }
34403460 c.targetBind(tar[:1], time, c.facing*c.distX(t, c), (t.pos[1]*t.localscl/c.localscl)-(c.pos[1]*c.localscl/t.localscl))
34413461 }
@@ -3946,7 +3966,7 @@ func (c *Char) bind() {
39463966 if bt := sys.playerID(c.bindToId); bt != nil {
39473967 if bt.hasTarget(c.id) {
39483968 if bt.sf(CSF_destroy) {
3949- c.selfState(5050, -1, -1, -1)
3969+ //c.selfState(5050, -1, -1, -1)
39503970 c.setBindTime(0)
39513971 return
39523972 }
@@ -3998,6 +4018,18 @@ func (c *Char) xScreenBound() {
39984018 x = MaxF(sys.stage.leftbound/c.localscl, MinF(sys.stage.rightbound/c.localscl, x))
39994019 c.setPosX(x)
40004020 }
4021+func (c *Char) xPlatformBound(pxmin, pxmax float32) {
4022+ x := c.pos[0]
4023+ if c.ss.stateType != ST_A {
4024+ min, max := c.getEdge(c.edge[0], true), -c.getEdge(c.edge[1], true)
4025+ if c.facing > 0 {
4026+ min, max = -max, -min
4027+ }
4028+ x = MaxF(min+pxmin/c.localscl, MinF(max+pxmax/c.localscl, x))
4029+ }
4030+ c.setX(x)
4031+ c.xScreenBound()
4032+}
40014033 func (c *Char) gethitBindClear() {
40024034 if c.isBound() {
40034035 c.setBindTime(0)
@@ -4338,7 +4370,7 @@ func (c *Char) action() {
43384370 }
43394371 for {
43404372 c.posUpdate()
4341- if c.ss.physics != ST_A || c.vel[1] <= 0 || c.pos[1] < 0 ||
4373+ if c.ss.physics != ST_A || c.vel[1] <= 0 || (c.pos[1]-c.platformPosY) < 0 ||
43424374 c.ss.no == 105 {
43434375 break
43444376 }
@@ -4432,6 +4464,8 @@ func (c *Char) update(cvmin, cvmax,
44324464 c.scf(SCF_ko) && c.scf(SCF_over) {
44334465 c.exitTarget(true)
44344466 }
4467+ c.platformPosY = 0
4468+ c.groundAngle = 0
44354469 c.atktmp = int8(Btoi((c.ss.moveType != MT_I ||
44364470 c.hitdef.reversal_attr > 0) && !c.hitPause()))
44374471 c.hoIdx = -1
@@ -5320,7 +5354,7 @@ func (cl *CharList) clsn(getter *Char, proj bool) {
53205354 }
53215355 if proj {
53225356 for i, pr := range sys.projs {
5323- if i == getter.playerNo && getter.helperIndex == 0 || len(sys.projs[i]) == 0 {
5357+ if len(sys.projs[i]) == 0 {
53245358 continue
53255359 }
53265360 c := sys.chars[i][0]
@@ -5328,14 +5362,47 @@ func (cl *CharList) clsn(getter *Char, proj bool) {
53285362 c.atktmp = -1
53295363 for j := range pr {
53305364 p := &pr[j]
5331- if p.id < 0 || p.hits < 0 || p.hitdef.affectteam != 0 &&
5365+ if (i == getter.playerNo && getter.helperIndex == 0 && p.platform == false) ||
5366+ p.id < 0 || p.hits < 0 || p.hitdef.affectteam != 0 &&
53325367 (getter.teamside != p.hitdef.teamside-1) != (p.hitdef.affectteam > 0) {
53335368 continue
53345369 }
5335- if dist := (getter.pos[0]*getter.localscl - p.pos[0]*p.localscl) * p.facing; dist >= 0 &&
5336- dist <= float32(c.size.proj.attack.dist)*c.localscl {
5370+ dist := (getter.pos[0]*getter.localscl - (p.pos[0])*p.localscl) * p.facing
5371+ if p.platform == false &&
5372+ dist >= 0 && dist <= float32(c.size.proj.attack.dist)*c.localscl {
53375373 getter.inguarddist = true
53385374 }
5375+ if p.platform == true {
5376+ //Platformの足場上空判定
5377+ if getter.pos[1]*getter.localscl-getter.vel[1]*getter.localscl <= (p.pos[1]+p.platformHeight[1])*p.localscl &&
5378+ getter.platformPosY*getter.localscl >= (p.pos[1]+p.platformHeight[0])*p.localscl {
5379+ angleSinValue := float32(math.Sin(float64(p.platformAngle) / 180 * math.Pi))
5380+ angleCosValue := float32(math.Cos(float64(p.platformAngle) / 180 * math.Pi))
5381+ oldDist := (getter.oldPos[0]*getter.localscl - (p.pos[0])*p.localscl) * p.facing
5382+ onPlatform := func(protrude bool) {
5383+ getter.platformPosY = ((p.pos[1]+p.platformHeight[0]+p.velocity[1])*p.localscl - angleSinValue*(oldDist/angleCosValue)) / getter.localscl
5384+ getter.groundAngle = p.platformAngle
5385+ //足場に乗っている状態
5386+ if getter.ss.stateType != ST_A {
5387+ getter.pos[0] += p.velocity[0] * p.facing * p.localscl / getter.localscl
5388+ getter.pos[1] += p.velocity[1] * p.localscl / getter.localscl
5389+ if protrude {
5390+ if p.facing > 0 {
5391+ getter.xPlatformBound((p.pos[0]+p.velocity[0]*2*p.facing+p.platformWidth[0]*angleCosValue*p.facing)*p.localscl, (p.pos[0]-p.velocity[0]*2*p.facing+p.platformWidth[1]*angleCosValue*p.facing)*p.localscl)
5392+ } else {
5393+ getter.xPlatformBound((p.pos[0]-p.velocity[0]*2*p.facing+p.platformWidth[1]*angleCosValue*p.facing)*p.localscl, (p.pos[0]+p.velocity[0]*2*p.facing+p.platformWidth[0]*angleCosValue*p.facing)*p.localscl)
5394+ }
5395+ }
5396+ }
5397+ }
5398+ if dist >= (p.platformWidth[0]*angleCosValue)*p.localscl && dist <= (p.platformWidth[1]*angleCosValue)*p.localscl {
5399+ onPlatform(false)
5400+ } else if p.platformFence && oldDist >= (p.platformWidth[0]*angleCosValue)*p.localscl &&
5401+ oldDist <= (p.platformWidth[1]*angleCosValue)*p.localscl {
5402+ onPlatform(true)
5403+ }
5404+ }
5405+ }
53395406 if p.hits == 0 {
53405407 continue
53415408 }
--- a/src/compiler.go
+++ b/src/compiler.go
@@ -2041,6 +2041,12 @@ func (c *Compiler) expValue(out *BytecodeExp, in *string,
20412041 return bvNone(), err
20422042 }
20432043 out.append(OC_ex_, OC_ex_selfstatenoexist)
2044+ case "groundangle":
2045+ out.append(OC_ex_, OC_ex_groundangle)
2046+ case "stagefrontedge":
2047+ out.append(OC_ex_, OC_ex_stagefrontedge)
2048+ case "stagebackedge":
2049+ out.append(OC_ex_, OC_ex_stagebackedge)
20442050 case "=", "!=", ">", ">=", "<", "<=", "&", "&&", "^", "^^", "|", "||",
20452051 "+", "*", "**", "/", "%":
20462052 if !sys.ignoreMostErrors || len(c.maeOp) > 0 {
@@ -4589,6 +4595,10 @@ func (c *Compiler) projectile(is IniSection, sc *StateControllerBase,
45894595 projectile_projscale, VT_Float, 2, false); err != nil {
45904596 return err
45914597 }
4598+ if err := c.paramValue(is, sc, "projangle",
4599+ projectile_projangle, VT_Float, 1, false); err != nil {
4600+ return err
4601+ }
45924602
45934603 // hitdef部分
45944604 if err := c.hitDefSub(is, sc); err != nil {
@@ -4638,6 +4648,26 @@ func (c *Compiler) projectile(is IniSection, sc *StateControllerBase,
46384648 if err := c.afterImageSub(is, sc, "afterimage."); err != nil {
46394649 return err
46404650 }
4651+ if err := c.paramValue(is, sc, "platform",
4652+ projectile_platform, VT_Bool, 1, false); err != nil {
4653+ return err
4654+ }
4655+ if err := c.paramValue(is, sc, "platformwidth",
4656+ projectile_platformwidth, VT_Float, 2, false); err != nil {
4657+ return err
4658+ }
4659+ if err := c.paramValue(is, sc, "platformheight",
4660+ projectile_platformheight, VT_Float, 2, false); err != nil {
4661+ return err
4662+ }
4663+ if err := c.paramValue(is, sc, "platformangle",
4664+ projectile_platformangle, VT_Float, 1, false); err != nil {
4665+ return err
4666+ }
4667+ if err := c.paramValue(is, sc, "platformfence",
4668+ projectile_platformfence, VT_Bool, 1, false); err != nil {
4669+ return err
4670+ }
46414671 return nil
46424672 })
46434673 return *ret, err