Jetrel
|
|
« Reply #44 on: December 29, 2010, 05:03:21 PM » |
|
Huge note: we have semi-weekly dev builds up here: http://www.frogatto.com/downloadThis means you can actually try out the changes I'm yammering about, rather than relying on idle speculation. At the moment I write this; the windows one is almost a month old. Check the timestamps, I'll get ben to update them. Arcade Progress:- Arcade levels are now actually accessible from the titlescreen of the game. We only have two varieties; horizontal, and vertical takes on "getting as far into the level as you can, and getting more points the further you get". - vertical arcade levels auto-scroll and kill the player if you can't keep up; this speed can procedurally increase over time - arcade levels can include optional elements - including entirely optional segments, that only appear further in. We don't use this yet. - we don't have a nice presentation when you die and it tallies up your points. Doing this kind of stuff is unfortunately awkward because we don't have a way to do it, yet, without doing a hardcoded dialogue layout in C++. We'll get there. Other Progress:- I've refactored the entire damage system in frogatto, because there was a ton of stuff we just couldn't do. For example, all the stuff we talked about in this thread. A few key examples: we had no concept of damage type; no way to react differently to different kinds. We also couldn't cap the DPS of enormous streams of shots - consider exactly what happens when you attack a boss with the fire-breath in kirby. Your damage is only dealt every second or so. If literally every shot (every individual little puff of fire that makes up the attack) dealt damage, the boss would be dead almost instantly. It's actually kind of amazing just how many shots get spewed with an attack like that. It's dozens of times higher than my intuition told me. Previously, we had sort of a half-implemented thing which tracked the "source" of the damage, and rendered a target invulnerable to that specific attacker, until some set time in the victim elapsed (and this time was really arbitrary, usually when the object entered a new animation). This had no provision for giving the attack, itself, control over the cooldown. I ripped that system out, and replaced it with something much simpler: when a character gets hit, they mark when. Every attack has a numerical cooldown value. When it hits, if the time between now and when the victim last got hit is less than this value, the attack is cancelled. From this, it has the nice side-effect that if an attack is set to zero, it always hits (which was a must-have feature). - Also, I've begun a new copy of the player character which experiments with some radically different physics, trying to make the character much easier to control. This is accessible by entering the editor (control+e), and opening the level "test4.cfg". This is hugely a work-in-progress, so you can expect severe screwiness at times. I'm abandoning most preconceived decisions we had made (such as the character sliding down during wall-clings) in favor of just free-experimentation. Not everything may be plausible in the real game; some stuff might be game-breakingly powerful. In this new player, there's a fire-breath attack accessible by pressing "d".
|
|
|
Logged
|
|
|
|
Jetrel
|
|
« Reply #46 on: January 04, 2011, 12:45:10 AM » |
|
As part of a really offbeat experiment, I just hacked together an RPG character in frogatto's engine - thus far, just able to walk around on a map, like zelda/chrono. This did not take a single line of C++. It's not in the latest public builds crimson_penguin just posted, but if you're able to compile from trunk, it's visible on the level named test5.cfg (if you can't compile from trunk, you could still conceivably grab the associated level, image, and object file, and they should run in the previous build. This is the core control code thus far; if you're interested in any explanation, ask away and I'll explain. Those interested might not that this took, start to finish, maybe 30min of coding/testing. In just 30 minutes, I was able to implement the heart of a completely different game. Frogatto's engine isn't good for anything that's not "2d sprites moving over a tiled, square background", but if that describes your game, it's damn near a glove fit. (We still have a few things that aren't generalized, but if anyone needs them to be, we can quickly get them to that.) [object_type] id=rpg_char_test hitpoints=4 feet_width=1 mass=5 friction=0 solid_area=4,48,23,60 traction_in_water=1000 affected_by_currents=yes
[properties] set_stand_anim="def() execute(me, if(velocity_x = 0 and velocity_y = 0,[if(animation = 'walk_north', animation('stand_north')),if(animation = 'walk_east', animation('stand_east')),if(animation = 'walk_south', animation('stand_south'))]))" pressing_north="ctrl_up and (not ctrl_down) and (not ctrl_left) and (not ctrl_right)" pressing_south="ctrl_down and (not ctrl_up) and (not ctrl_left) and (not ctrl_right)" pressing_west="ctrl_left and (not ctrl_right) and (not ctrl_up) and (not ctrl_down)" pressing_east="ctrl_right and (not ctrl_left) and (not ctrl_up) and (not ctrl_down)" pressing_nw="ctrl_up and (not ctrl_down) and ctrl_left and (not ctrl_right)" pressing_ne="ctrl_up and (not ctrl_down) and ctrl_right and (not ctrl_left)" pressing_sw="ctrl_down and (not ctrl_up) and ctrl_left and (not ctrl_right)" pressing_se="ctrl_down and (not ctrl_up) and ctrl_right and (not ctrl_left)"
moving_north="velocity_x = 0 and velocity_y < 0" moving_south="velocity_x = 0 and velocity_y > 0" moving_west="velocity_x < 0 and velocity_y = 0" moving_east="velocity_x > 0 and velocity_y = 0" moving_nw="velocity_x < 0 and velocity_y < 0" moving_ne="velocity_x > 0 and velocity_y < 0" moving_sw="velocity_x < 0 and velocity_y > 0" moving_se="velocity_x > 0 and velocity_y > 0" [/properties]
on_process="[ if(pressing_north and (not moving_north), [animation('walk_north'), facing(1)]), if(pressing_south and (not moving_south), [animation('walk_south'), facing(1)]), if(pressing_west and (not moving_west), [set(velocity_x,-400),animation('walk_east'),facing(-1)]), if(pressing_east and (not moving_east), [set(velocity_x, 400),animation('walk_east'),facing(1)]), if(pressing_nw and (not moving_nw), [set(velocity_x,-400), animation('walk_north'), facing(1)]), if(pressing_ne and (not moving_ne), [set(velocity_x, 400), animation('walk_north'), facing(1)]),
if(pressing_sw and (not moving_sw), [set(velocity_x,-400), animation('walk_south'), facing(1)]), if(pressing_se and (not moving_se), [set(velocity_x, 400), animation('walk_south'), facing(1)]),
if(ctrl_up and ctrl_down, [set(velocity_y,0),set_stand_anim()]), if(ctrl_up + ctrl_down = 0, [set(velocity_y,0),set_stand_anim()]), if(ctrl_left and ctrl_right, [set(velocity_x,0),set_stand_anim()]), if(ctrl_left + ctrl_right = 0, [set(velocity_x,0),set_stand_anim()]) ]" on_end_anim="animation(animation)"
[editor_info] category=player [/editor_info]
[base:animation] image=experimental/claudius.png accel_x=0 accel_y=0 pad=3 body_area=all [/animation] [animation] id=stand_south rect=1,1,30,62 frames=1 duration=6 [/animation] [animation] id=stand_north rect=1,66,30,127 frames=1 duration=6 [/animation] [animation] id=stand_east rect=1,131,30,192 frames=1 duration=6 [/animation] [animation] id=walk_south rect=39,1,68,62 frames=8 duration=5 velocity_y=400 [/animation] [animation] id=walk_north rect=39,66,68,127 frames=8 duration=5 velocity_y=-400 [/animation] [animation] id=walk_east rect=39,131,68,192 frames=8 duration=5 [/animation] [/object_type]
|
|
|
Logged
|
|
|
|