Shadows of Death

Complete Shadows of Death 1.2

No permission to download
Project is completed.

Kratus

OpenBOR Developer
Staff member
I'm wondering lately how can I stop an enemy subtype biker at his death? I tried
Code:
jumpframe 0 0 0 , @cmd dasher 0 0 0 @cmd stop
but with no success :/.
The demo set museum test if you want to take a look:
I never tested it before, but for some reason an entity that has a subtype biker will never stop, even with scripts. I will investigate how it works in the source code.

The only effective way I found is by using the "killentity" function, but before the biker is killed, you will need to spawn another entity with a different subtype that simulates a "fake" bike stop.
 

DCurrent

Site Owner, OpenBOR Project Leader
Staff member
I never tested it before, but for some reason an entity that has a subtype biker will never stop, even with scripts. I will investigate how it works in the source code.

The only effective way I found is by using the "killentity" function, but before the biker is killed, you will need to spawn another entity with a different subtype that simulates a "fake" bike stop.

I can make this quick for you. Legacy bikers have their own intentionally simple AI routine. It constantly updates their velocity based on model speed, or a random value if speed is 0.

C:
if(self->modeldata.speed.x)
{
    self->velocity.x = (self->direction == DIRECTION_RIGHT) ? (self->modeldata.speed.x) : (-self->modeldata.speed.x);
}
else
{
    self->velocity.x = (self->direction == DIRECTION_RIGHT) ? ((float)1.7 + randf((float)0.6)) : (-((float)1.7 + randf((float)0.6)));
}

Stopping them is therefore very difficult. The best thing is to go ahead and kill them while spawning an alternate entity with default AI. That's how the native biker->rider works.

DC
 

kimono

Well-known member
@Kratus: Thanks for these precisions, this is more clear now :) . I will try @DCurrent solution but I hope that this biker subtype can be updated for a more customizable death.
 

DCurrent

Site Owner, OpenBOR Project Leader
Staff member
@Kratus: Thanks for these precisions, this is more clear now :) . I will try @DCurrent solution but I hope that this biker subtype can be updated for a more customizable death.
No, it will not be. As I just mentioned, it is a legacy feature and intentionally simple to be as resource light as possible. The functionality is already available through other means.

DC
 

Kratus

OpenBOR Developer
Staff member
I can make this quick for you. Legacy bikers have their own intentionally simple AI routine. It constantly updates their velocity based on model speed, or a random value if speed is 0.

C:
if(self->modeldata.speed.x)
{
    self->velocity.x = (self->direction == DIRECTION_RIGHT) ? (self->modeldata.speed.x) : (-self->modeldata.speed.x);
}
else
{
    self->velocity.x = (self->direction == DIRECTION_RIGHT) ? ((float)1.7 + randf((float)0.6)) : (-((float)1.7 + randf((float)0.6)));
}

Stopping them is therefore very difficult. The best thing is to go ahead and kill them while spawning an alternate entity with default AI. That's how the native biker->rider works.

DC
@DCurrent

Thanks for the informations. It's good to know that the subtype biker is working as intended.
In this case, the "killentity" solution seems to be a good one.


@kimono

As a second option, same as I made in the SOR2X with the "jumping" bikers, you can create a biker with a different subtype and this way you can add custom behaviors.
They are simple enemies using "subtype notgrab", "nomove 1 1", "offscreenkill" and @cmd dasher in your idle animation.
 

kimono

Well-known member
Thanks Kratus, I set the
Code:
subtype biker
Shadowskater entity with only the skate on his anim pain an fall;
anim fall correponds to the fall of the skater and the rise of the
Code:
subtype rider
MidshadowS like his anim spawn:

Code:
##MAIN
name                Shadowskater
type                enemy
subtype             biker
rider                 MidshadowS
hostile                player
candamage            player npc

##LIFE
health                4

##POWER
offense             1 #SCRIPT

##SPEED
speed                9 #SCRIPT
running             20 3.1 1.2 1 0

##JUMP
jumpmove     3 3
jumpheight     3

##ENERGY
mp                    120
mprate              1 #SCRIPT

##GRAB
grabdistance         33 #36/33/30
grabfinish             0 #PLAYER=0/ENEMY=1

##WEIGHT/HEIGHT
antigravity            -6 #-3/-6/-9
height                74

##MISC
jugglepoints        30
guardpoints            20
guardrate            4
risetime            170
riseinv                0.4 1 #HEROES 0.4 - ENEMY 0 - BOSS 0.4
makeinv                2 0
atchain                1
#gfxshadow            1 1
dust                dust
bflash                block
nodieblink             2
death                 1

##ICONS
icon                data/chars/shadowskater/icon.png 1
iconpain            data/chars/shadowskater/iconpain.png 1

##DIESOUND
diesound            sound    data/voice/shadow_die.wav

animationscript        data/scripts/lescript.c

load     MidshadowS
load     coin

##ANIMATIONS#############################################################################
anim spawn
    delay    16
    offset    47 94
    frame    data/chars/shadowskater/spawn1.png
    frame    data/chars/shadowskater/spawn2.png
    frame    data/chars/shadowskater/spawn3.png
    frame    data/chars/shadowskater/spawn4.png
    frame    data/chars/shadowskater/spawn5.png

anim idle
    loop    1
    delay    30
    offset    47 94
    bbox 30 11 37 83
    frame    data/chars/shadowskater/stand1.png
    frame    data/chars/shadowskater/stand2.png
    frame    data/chars/shadowskater/stand3.png
    frame    data/chars/shadowskater/stand2.png

anim walk
    loop    1
    delay    12
    offset    47 94
    bbox 30 11 37 83
    frame    data/chars/shadowskater/walk1.png
    frame    data/chars/shadowskater/walk2.png
    frame    data/chars/shadowskater/walk3.png
    frame    data/chars/shadowskater/walk2.png
    
anim run
    loop    1
    delay    10
    loop    1
    delay    12
    offset    47 94
    bbox 30 11 37 83
    frame    data/chars/shadowskater/walk1.png
    frame    data/chars/shadowskater/walk2.png
    frame    data/chars/shadowskater/walk3.png
    frame    data/chars/shadowskater/walk2.png
    
anim attack1
    fastattack 1
    jugglecost 5
    forcedirection -1
    range   0 120
    delay    10
    offset    47 94
    bbox 30 11 37 83
    hitflash blood
    hitfx    data/sounds/aof2-199.wav
    jumpframe 0 2 2
    sound    data/voice/shadow_attack.wav
    frame    data/chars/shadowskater/attack1.png
    frame    data/chars/shadowskater/attack2.png
    attack1 22 72 64 22 2 1 0 0 5 12
    frame    data/chars/shadowskater/attack3.png
    frame    data/chars/shadowskater/attack4.png
    frame    data/chars/shadowskater/attack5.png
    attack1 0 0 0 0 0 0 0 0 0 0
    frame    data/chars/shadowskater/attack5.png   
    
anim get
    delay    5
    offset    47 94
    bbox 30 11 37 83
    frame    data/chars/shadowskater/attack1.png
    frame    data/chars/shadowskater/attack1.png
    
anim pain #UP
    delay    24
    offset    47 94
    bbox 30 11 37 83
    frame    data/chars/shadowskater/skate.png

anim fall #NORMAL
    landframe 1
    sound    data/voice/shadow_hurt.wav
    delay    24
    offset    47 94
    bbox 30 11 37 83
    frame    data/chars/shadowskater/skate.png

anim rise
    delay    10
    offset    47 94
    frame    data/chars/shadowskater/skate.png

anim death
    landframe 1
    sound    data/voice/shadow_die.wav
    @cmd    spawn01 "coin" 0 40 0 0
    @cmd    spawn01 "coin" 15 40 0 0
    delay    24
    offset    47 94
    bbox 30 11 37 83
    frame    data/chars/shadowskater/skate.png

Code:
##MAIN
name                MidshadowS
type                enemy
hostile                player
candamage            player npc

##LIFE
health                3

##POWER
offense             1 #SCRIPT

##SPEED
speed                9 #SCRIPT
running             20 3.1 1.2 1 0

##ENERGY
mp                    120
mprate              1 #SCRIPT

##GRAB
grabdistance         33 #36/33/30
grabfinish             0 #PLAYER=0/ENEMY=1

##WEIGHT/HEIGHT
antigravity            -6 #-3/-6/-9
height                74

##MISC
jugglepoints        30
guardpoints            20
guardrate            4
risetime            170
riseinv                0.4 1 #HEROES 0.4 - ENEMY 0 - BOSS 0.4
makeinv                2 0
atchain                1
#gfxshadow            1 1
dust                dust
bflash                block
nodieblink             2
death                 1

##ICONS
icon                data/chars/midshadow/icon.png 1
iconpain            data/chars/midshadow/iconpain.png 1

##DIESOUND
diesound            sound    data/voice/shadow_die.wav

animationscript        data/scripts/lescript.c

load     coin

##ANIMATIONS#############################################################################
anim spawn
    delay    16
    offset    47 102
    bbox 30 19 37 83
    sound    data/voice/shadow_hurt.wav
    frame    data/chars/shadowskater/death1.png
    frame    data/chars/shadowskater/death2.png
    frame    data/chars/shadowskater/death3.png
    frame    data/chars/shadowskater/death4.png
    frame    data/chars/shadowskater/death5.png
    frame    data/chars/shadowskater/death6.png

anim idle
    loop    1
    delay    30
    offset    28 60
    bbox 21 11 37 48
    frame    data/chars/midshadow/stand1.png
    frame    data/chars/midshadow/stand2.png
    frame    data/chars/midshadow/stand3.png
    frame    data/chars/midshadow/stand2.png

anim walk
    loop    1
    delay    12
    offset    14 60
    bbox 2 11 37 48
    frame    data/chars/midshadow/walk1.png
    frame    data/chars/midshadow/walk2.png
    frame    data/chars/midshadow/walk3.png
    frame    data/chars/midshadow/walk4.png
    frame    data/chars/midshadow/walk5.png   
    
anim run
    loop    1
    delay    10
    offset    14 60
    bbox 2 11 37 48
    frame    data/chars/midshadow/walk1.png
    frame    data/chars/midshadow/walk2.png
    frame    data/chars/midshadow/walk3.png
    frame    data/chars/midshadow/walk4.png   
    frame    data/chars/midshadow/walk5.png
    
anim get
    delay    5
    offset    28 60
    bbox 21 11 37 48
    frame    data/chars/midshadow/stand3.png
    frame    data/chars/midshadow/stand3.png
    
anim pain #UP
    delay    24
    offset    14 60
    bbox 2 11 37 48
    sound    data/voice/shadow_hurt.wav
    frame    data/chars/midshadow/hurt.png
    frame    data/chars/midshadow/hurt.png

anim fall #NORMAL
    landframe 5
    delay 16
    offset    47 94
    sound    data/voice/shadow_hurt.wav
    frame    data/chars/shadowskater/deathskate1.png
    frame    data/chars/shadowskater/deathskate2.png
    frame    data/chars/shadowskater/deathskate3.png
    frame    data/chars/shadowskater/deathskate4.png
    frame    data/chars/shadowskater/deathskate5.png
    frame    data/chars/shadowskater/deathskate6.png

anim rise
    delay    16
    offset    28 60
    bbox 21 11 37 48
    frame    data/chars/midshadow/spawn1.png
    frame    data/chars/midshadow/spawn2.png
    frame    data/chars/midshadow/spawn3.png
    frame    data/chars/midshadow/spawn4.png
    frame    data/chars/midshadow/spawn5.png

anim death
    landframe 1
    delay    16
    offset    28 60
    sound    data/voice/shadow_die.wav
    @cmd   spawn01 "coin" 0 40 0 0
    @cmd   spawn01 "coin" 15 40 0 0
    frame    data/chars/midshadow/spawn5.png
    frame    data/chars/midshadow/spawn4.png
    frame    data/chars/midshadow/spawn3.png
    frame    data/chars/midshadow/spawn2.png
    @cmd    Shadremen
    frame    data/chars/midshadow/spawn1.png

anim death2
    landframe 1
    delay    16
    offset    42 66
    sound    data/voice/shadow_die.wav
    @cmd   spawn01 "coin" 0 40 0 0
    @cmd   spawn01 "coin" 15 40 0 0
    frame    data/chars/midshadow/deaths1.png
    frame    data/chars/midshadow/deaths2.png
    frame    data/chars/midshadow/deaths3.png   
    frame    data/chars/midshadow/deaths4.png   
    @cmd    Shadremen
    drawmethod alpha 6
    drawmethod channel 0.7
    frame    data/chars/midshadow/deaths4.png   
    drawmethod channel 0.5
    frame    data/chars/midshadow/deaths4.png
    drawmethod channel 0.3
    frame    data/chars/midshadow/deaths4.png

anim attack1
    fastattack 1
    jugglecost 5
    forcedirection -1
    delay    6
    offset    28 60
    bbox 21 11 37 48
    hitflash blood
    hitfx    data/sounds/aof2-199.wav
    attack1 0 0 0 0 0 0 0 0 0 0
    sound    data/voice/shadow_attack.wav
    frame    data/chars/midshadow/attack1.png
    attack1 65 17 64 22 2 1 0 0 5 12
    frame    data/chars/midshadow/attack2.png
    attack1 0 0 0 0 0 0 0 0 0 0
    frame    data/chars/midshadow/attack1.png
The result in video:

Maybye I can set this better; I know that biker and rider share health between each other.
 

kimono

Well-known member
276284632_989034795376955_4215360492845499736_n.jpg

@kimono updated Shadows of Death with a new update entry:

SoD 1.2 Release

View attachment 1476

SoD 1.2 is out! The content of this update:
  • 8 new stages: museum exterior, museum interior, prehistoric, medieval, future, futurerace, motobar, motorace
  • 8 new musics: Remember me, Mystery of the Museum, Prehistoire, Medieval song, No future, Startrek theme, Racer coffee, Shadow racer
  • 7 new obstacles : traffic cone, statue, time machine, stone monument, asteroid small, asteroid big, 2cv, 4L, 205, fuego, r5, truck
  • 12 new enemies: shadowskater...

Read the rest of this update entry...

@dai92 : Can you please make a playthrough of the game? Thanks buddy :)
 
Last edited by a moderator:

DCurrent

Site Owner, OpenBOR Project Leader
Staff member
@kimono,

I created a proper update to the resource, removed your third party links, and attached your title image as a thumbnail. This is the second time I have done this for you. Please do not not use third party links again for a release or next time I will simply delete the post. If you don't know how to update a resource, just ask and we'll help.

Now with the ugly stuff out of the way, congratulations on the release. Keep up the good work! (y)

DC
 

kimono

Well-known member
Thanks Damon, I'm just trying to learn to shape my posts correctly 😊. If I want to offer 2 versions like an open source and a pak file, do I need to host the first here and the second (pak) to a third party link or I can host the 2 files (or only the pak) at Chrono Crash site?
 

DCurrent

Site Owner, OpenBOR Project Leader
Staff member
Thanks Damon, I'm just trying to learn to shape my posts correctly 😊. If I want to offer 2 versions like an open source and a pak file, do I need to host the first here and the second (pak) to a third party link or I can host the 2 files (or only the pak) at Chrono Crash site?

You can host both here, which I've already done when I updated for you. The upload system allows you to attach more than one file, and then users are presented with a choice when they click the Download button.

1648387246908.png

That said, if I were you and wanted to keep a public open source archive, I would upload to GitHub, and work live from that. Then I would put the GitHub repository url into the Alternative Support URL field. This causes the forum to place a big button in your download page that would take users to the repository where they'd see your latest source.


1648387405943.png

HTH,
DC
 

kimono

Well-known member
Thanks DC, this is a really good idea to put all the open source projects to Github. I will do that for Golden Axe and Barbarian too :) .
One video playthrough with Kelly by Javi.D:
 
Last edited:

Sylvain Regnier

New member
I've just played it ! I adore the sprite work, as well as the voice acting and the 8-bit remix ! Some debug I would consider are :

-the versus mode has no end. I would suggest giving a boss status to Axel(if I remember correctly ?)

-the broken car still respond to hit, even after being destroyed

-the victory animation plays as soon as every enemies are gone, so the last coin they dropped can't be taken

-the street shadows in front of the theater cans spawn in the three tiles at once, meaning you're forced to be it by one

-the lil & mid shadow doesn't seems to have a cooldown, so they can combo stun you easily

-I'm not sure I did that, but since the statue regenerate at the museum each time you take the time machine, you can create a loop for infinite lives easily

I also have a huge pack of suggestions to make, but I don't think that would be called for, considering you're much more experienced that me. I'll just say it was a great time, no doubt ! 🤌
 

kimono

Well-known member
Hi @Sylvain Regnier and thanks for your feedback:
- The versus mode ends when you are between another player. If you are only one player, you can end it by pressing start and quit. This mode isn't so much developped actually but we'll see what we can do here to offer more content.
- Some obstacles still respond to hits but they didn't give more items ;)
- You can still take the coins and items if you move the directional keys; if you stop, anim victory is played and the level ends.
- For these lilshadowsslabs, I can add a small delay between their spawns if it's a problem for the player. I can even make the slab blinking before the entity spawns to inform the player.
- You can escape from being hit pressing left of right during the pain animation so Billy (or Kelly) can perform a shoulder dash attack.
- Thanks for this infinite respawn exploit, I can replace the life item here by another object ;)

I hope that you've good time to go through the game and you managed to reach the end 8) .
 

Sylvain Regnier

New member
Hi @Sylvain Regnier and thanks for your feedback:
- The versus mode ends when you are between another player. If you are only one player, you can end it by pressing start and quit. This mode isn't so much developped actually but we'll see what we can do here to offer more content.
- Some obstacles still respond to hits but they didn't give more items ;)
- You can still take the coins and items if you move the directional keys; if you stop, anim victory is played and the level ends.
- For these lilshadowsslabs, I can add a small delay between their spawns if it's a problem for the player. I can even make the slab blinking before the entity spawns to inform the player.
- You can escape from being hit pressing left of right during the pain animation so Billy (or Kelly) can perform a shoulder dash attack.
- Thanks for this infinite respawn exploit, I can replace the life item here by another object ;)

I hope that you've good time to go through the game and you managed to reach the end 8) .
You're welcome! It was a pleasure. Additional teadbit :
-shadowstripe, during the Gremlins movie, was incredibly slow once I picked up the clock, even after it disappeared. Mind if I search the code for an explanation, as training? X3
-I've just left one life and ~15coins in a level because of that instant animation. I'm sure I'ld prefer a 3-second delay once everyone is gone to gather resources and focus instead.
-in a pinch, I can stress and continuously grab/throw a nunchuck when I've got one in my hand and one on the floor. That's not important, but is there a script to avoid such continuous weapon pick-up, if you know what I mean?
-about the lilshadowsslabs, I would be more in favor of a jump button or giving them a hitbox during their spawn animation.

Edit:
-robot cat stunlocked a giant shadow robot and clubbed him to death in the future level. That was hilariously overpowered from his part. X'D
-I start with 2 lives when I load the game.
 
Last edited:
Top Bottom