Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length

 
Advanced search

1043401 Posts in 42275 Topics- by 33938 Members - Latest Member: PeterRoy

September 18, 2014, 05:38:58 AM
TIGSource ForumsFeedbackDevLogsoperation bloodshed
Pages: [1] 2 3 ... 5
Print
Author Topic: operation bloodshed  (Read 7438 times)
vittorioromeo
Level 1
*



View Profile WWW Email
« on: September 19, 2013, 11:43:22 PM »



operation bloodshed
GitHub: https://github.com/SuperV1234/SSVBloodshed


what
This is my attempt at the creation of a spiritual successor to Operation Carnage, one of my favorite childhood games.
Operation Carnage is a 1996 abandonware arcade game with a very simple but addicting and fun gameplay. It has a very interesting shooting/strafing mechanic that is easy to learn but hard to master.
Unfortunately, it also has some design flaws that I'll try to solve in my game.

why
I'll attempt creating this game for various reasons:
1) I feel that Operation Carnage has never got the attention it deserved. Even if it's not a very innovative game, it's certainly a very fun 90's arcade experience, that has some interesting ideas which can be improved.
2) A `clone` of the game, Hyper Princess Pitch, was created by Daniel Remar. It is awesome and you should play it, but, in my opinion, it doesn't solve the design issues the original game had.
3) I haven't done much work since LD27 and I want a project to work on.

how
My language of choice is C++11.
I'll use QTCreator and Sublime Text as my coding tools.
PyxelEdit will be used for graphics.
I will use my own framework, the SSV Framework, and SFML2.1.
As my previous projects, the end result will be free, open-source and cross-platform.





Devlog (audio-commented) videos:

devlog #16 - http://www.youtube.com/watch?v=JG960pauKVs
(GUI, force fields, bullet boosters)

devlog #15 - http://www.youtube.com/watch?v=RHwQIXKO1n4
(on-off pressure plates, explosives, new elements/tweaks)

devlog #14 - http://www.youtube.com/watch?v=1iPkM9olna0
(new elements, multi-level sectors)

devlog #13 - http://www.youtube.com/watch?v=pIcEywsZ5eE
(many new elements)

devlog #12 - http://www.youtube.com/watch?v=hV5kkPBYfXI
(fully working level editor)

devlog #11 - http://www.youtube.com/watch?v=43gyuU-FdCY
(particle blendmodes, ai changes, wip editor)

devlog #10 - http://www.youtube.com/watch?v=blq33UhomBE
(wall autotiling, charge particles, raycasting, new gfx)

devlog #9 - http://www.youtube.com/watch?v=8GT8zbgt0ow
(turrets, new enemies, bar hp counter)

devlog #8 - http://www.youtube.com/watch?v=Za2w-nNwe0g
(all enemies can now have weapons)

devlog #7 - http://www.youtube.com/watch?v=5JmZmp_x5Uc
(major progress: ai, gfx, etc...)

devlog #6 - http://www.youtube.com/watch?v=_y_xcvS_aIk
(possible enemy types demonstration)

devlog #5 - http://www.youtube.com/watch?v=wkPzUk5oSMA
(testing enemies that shoot)

devlog #4 - http://www.youtube.com/watch?v=mcRPckkV1XM
(test particles redux)

devlog #3 - http://www.youtube.com/watch?v=KW-cqoaXmVk
(test particles)

devlog #2 - http://www.youtube.com/watch?v=DaIqr5thCQ0
(shooting test, enemy test)

devlog #1 - http://www.youtube.com/watch?v=0KVp2j5hbxI
(new possible project)
« Last Edit: November 23, 2013, 03:38:01 AM by vittorioromeo » Logged

vittorioromeo
Level 1
*



View Profile WWW Email
« Reply #1 on: September 20, 2013, 02:10:33 AM »

first video
http://www.youtube.com/watch?v=0KVp2j5hbxI
Shows movement mechanics and custom pseudo-physics.

design thoughts
The following thoughts apply both to Operation Carnage and Hyper Princess Pitch.
The main problem I have with the original game is that it is very luck based.
Getting a random powerup drop could mean the difference between clearing a room or losing a life.
How to preserve the fun "overpowered" powerup mechanics while preventing luck based gameplay?
Maybe, instead of random drops, have enemies drop money (or any other resource) that can be spent to buy powerups? Or just place powerups manually in the levels?

Also, constantly getting flamethrower ammunition would give an advantage, since flames stop bullets.
And this is my second complaint: the flamethrower is overpowered.
The bullet-blocking flamethrower is the "iconic" weapon of Operation Carnage. How can it be balanced?
Maybe have very limited and expensive ammunition. Maybe have some kind of enemy projectiles that cannot be blocked by the flamethrower at all.
Or maybe add an overheating mechanic, so that the player cannot be constantly shielded by the flamethrower but has to time its usage.

Another major complaint: the "I fucked up early, let's restart" syndrome.
In arcade games like Operation Carnage, where you have a limited amount of lives, dying on the first or second level usually means a restart, as you need the extra lives for later levels. This is incredibly annoying. You have to play those levels perfectly or else you have to restart.
The same problem applies to games like Touhou, for example.
How to preserve unforgiving game difficulty while solving the early-restart problem?
Maybe, the player could have a limited amount of lives per level, that gets refilled on every level. It's basically saying "You're allowed to fuck up twice per level", and levels obviously become harder over time.
Actually, I think I like this solution.

pro modes
The original game offers 4 difficulty modes, that increase enemy speed/health and decrease player health.
I'm planning to have the following modes:
Easy mode: for newcomers - enemy damage output decreased, more lives per level, etc.
Official mode: the regular gameplay mode. Easy in the early levels, incredibly hard in the later levels. Comes with a built-in speedrun timer.
Mayhem mode: the ħardcore gameplay mode. Same parameters as Official Mode. 1-hit kill. 1 life. Comes with a built-in speedrun timer.
Sandbox mode: the user can choose starting levels, mess around with game parameters, etc. Useful for practice and fun to play around with.
Logged

vittorioromeo
Level 1
*



View Profile WWW Email
« Reply #2 on: September 20, 2013, 05:10:05 AM »

new video
http://www.youtube.com/watch?v=DaIqr5thCQ0
Shows testing shooting mechanic and testing enemy behavior.



Hmm... should the enemies collide between each other?

bonus video
http://www.youtube.com/watch?v=T9mN7Vq0x9U
Me playing Operation Carnage.
Logged

vittorioromeo
Level 1
*



View Profile WWW Email
« Reply #3 on: September 20, 2013, 07:09:32 AM »

new video - particles
http://www.youtube.com/watch?v=mcRPckkV1XM
Implemented a basic particle system, where particles can either stay forever or get deleted. The floor fills up with blood!

The code is horrible, but I'll spend the afternoon refactoring.
Logged

vittorioromeo
Level 1
*



View Profile WWW Email
« Reply #4 on: September 21, 2013, 02:50:40 AM »

a .gif I made yesterday


and a new mockup


Unfortunately I'm really unsatisfied with the current graphics. I can't seem to make enemies/player stand out, and they become hard to see during gameplay. Accepting any suggestion on how to make important entities more visible.
Logged

Quarry
Level 10
*****



View Profile WWW
« Reply #5 on: September 21, 2013, 04:16:33 AM »

How exactly do you handle all those blood particles? They don't seem to cause any sort of frame drops and I think there's a good amount of them
Logged

 
vittorioromeo
Level 1
*



View Profile WWW Email
« Reply #6 on: September 21, 2013, 05:06:18 AM »

How exactly do you handle all those blood particles? They don't seem to cause any sort of frame drops and I think there's a good amount of them

Particle is a lightweight struct that only stores various parameters:
Code:
struct Particle {
    Vec2f position, velocity;
    float acceleration{0.f};
    sf::Color color;
    float size{1.f}, life{100.f}, lifeMax{100.f}, opacityMult{1.f};
}

I then have a ParticleSystem class that does the rendering:
Code:
class ParticleSystem : public sf::Drawable
{
    private:
        sf::VertexArray vertices{sf::PrimitiveType::Quads};
        std::vector<Particle> particles;

    public:
        inline ParticleSystem() { particles.reserve(350); }
        inline void create(const Vec2f& mPosition, const Vec2f& mVelocity, float mAcceleration, const sf::Color& mColor,
            float mSize, float mLife, float mOpacityMult = 1.f)
        {
            particles.emplace_back(mPosition, mVelocity, mAcceleration, mColor, mSize, mLife, mOpacityMult);
        }
        inline void update(float mFrameTime)
        {
            ssvu::eraseRemoveIf(particles, [](const Particle& mParticle){ return mParticle.getLife() <= 0; });
            vertices.clear();
            for(auto& p : particles)
            {
                p.update(mFrameTime);
                vertices.append({Vec2f(p.getPosition().x - p.getSize(), p.getPosition().y - p.getSize()), p.getColor()});
                vertices.append({Vec2f(p.getPosition().x + p.getSize(), p.getPosition().y - p.getSize()), p.getColor()});
                vertices.append({Vec2f(p.getPosition().x + p.getSize(), p.getPosition().y + p.getSize()), p.getColor()});
                vertices.append({Vec2f(p.getPosition().x - p.getSize(), p.getPosition().y + p.getSize()), p.getColor()});
            }
        }

        inline void draw(sf::RenderTarget& mRenderTarget, sf::RenderStates mRenderStates) const override { mRenderTarget.draw(vertices, mRenderStates); }
        inline void clear() { particles.clear(); }
};

Basically, every frame I clear and re-generate particle vertices in the ParticleSystem. Then I batch-render all of the vertices at once.
Also, C++11 emplacement and inlining help performance significantly.

I tried having every particle store its own vertices in my first approach, but it was considerably slower than clearing and re-generating all particle vertices every frame.

Real code is here on GitHub: https://github.com/SuperV1234/SSVBloodshed
Logged

vittorioromeo
Level 1
*



View Profile WWW Email
« Reply #7 on: September 21, 2013, 05:38:23 AM »

new video and .gif
Testing enemies that shoot back.

http://www.youtube.com/watch?v=wkPzUk5oSMA

Logged

Udderdude
Level 10
*****


464371439


View Profile WWW
« Reply #8 on: September 21, 2013, 06:17:59 AM »

The player and enemy sprites are teeny, might want to do something about that ..

Logged

vittorioromeo
Level 1
*



View Profile WWW Email
« Reply #9 on: September 21, 2013, 06:54:33 AM »

The player and enemy sprites are teeny, might want to do something about that ..

At the moment they aren't really easy too see... I would like to find a way to make them more visible while keeping them tiny - if everything fails I'll consider making them a little bigger.

Also,

Logged

Udderdude
Level 10
*****


464371439


View Profile WWW
« Reply #10 on: September 21, 2013, 09:02:50 AM »

I definitely saw you get hit by a couple of those shots, yet you didn't lose any life .. Epileptic
Logged

vittorioromeo
Level 1
*



View Profile WWW Email
« Reply #11 on: September 21, 2013, 09:34:16 AM »

I definitely saw you get hit by a couple of those shots, yet you didn't lose any life .. Epileptic

Shh... the HUD is just a texture. Smiley


Having too much fun messing around with the code...
Logged

vittorioromeo
Level 1
*



View Profile WWW Email
« Reply #12 on: September 22, 2013, 06:28:02 AM »

bugs...
Today I spent most of my morning fixing memory bugs.
I thought my libraries were stable but found a lot of issues that (hopefully) should now be resolved.

Also...

Surrounded by enemies? Sad
Use a smart bomb™!

Logged

Quarry
Level 10
*****



View Profile WWW
« Reply #13 on: September 22, 2013, 06:48:28 AM »

Are the graphical glitches caused by the GIF?
Logged

 
Udderdude
Level 10
*****


464371439


View Profile WWW
« Reply #14 on: September 22, 2013, 06:52:43 AM »

I'm not seeing any glitches ..
Logged

Quarry
Level 10
*****



View Profile WWW
« Reply #15 on: September 22, 2013, 06:56:42 AM »

I'm not seeing any glitches ..

Random bits of green pixel leftovers, get your eyes checked
Logged

 
vittorioromeo
Level 1
*



View Profile WWW Email
« Reply #16 on: September 22, 2013, 07:00:57 AM »

Yep, there are some .gif glitches. I recorded it as usual, but had to crop it with GIMP because it was too big. And it got glitched  Sad

design - classes
In order to increase replay value and variety my plan is to implement class selection.
When you start the game, after choosing difficulty you are greeted with a class selection screen. Every class has its own 3 weapons, its own smartbomb, and maybe other quirks.



1. Ranger
The classic Operation Carnage guy.
Health: medium.
Speed: medium.
> Machine gun: fast, low damage, fires in a straight line, infinite ammo
> Plasma gun: slow, very high damage, piercing, fires in a straight line, low ammo
> Flamethrower: fast, high damage, piercing, fires in a cone, very low ammo, shields from incoming bullets
+ Scatter bomb: deploys a lot of small explosive spherical bombs around the player

2. Commando
The heavyweight guy.
Health: high.
Speed: low.
> Shotgun: slow, medium damage, fires in a cone, infinite ammo, short range
> Earthsplitter: very slow, very high damage, piercing, fires in a straight line, very low ammo, causes explosion where it hits, destroys floor
> Chaingun: fast, high damage, fires in a cone, high ammo, shields from incoming bullets, slows the player down during usage
+ Shockwave: fires a 360° shockwave that deals less damage the further it travels - it isn't blocked by walls

3. Assassin
The fast guy with the double pistols. Fires in two directions!
Health: low.
Speed: fast.
> Hollow point bullets: fast, low damage, fires in a straight line, infinite ammo
> Pulse bullets: slow (charge and release), very high damage, piercing, fires in a straight line, very low ammo
> Acid spray: medium (first in bursts), high damage, piercing, fires in a cone, very low ammo, shields from incoming bullets
+ Gauntlet bomb: (similar to the .gif) deploys rotating blades around the player that deal high damage to enemies surrounding him

4. Knight
The melee guy. Has a rage meter or something that fills up with combos and stuff.
Health: high.
Speed: medium.
> Basic slash: slow (charge and release), shields from incoming bullets
> Fire slash: slow (charge and release), very high damage, piercing, fires in a straight line, medium ammo, shields from incoming bullets
> Energy boomerang: mediums speed, high damage, piercing, fires in a straight line, medium ammo - you have to wait for the boomerang to come back before being able to fire again
+ Lightning bomb: instant chain-lightning bomb that jumps between enemies
Logged

Udderdude
Level 10
*****


464371439


View Profile WWW
« Reply #17 on: September 22, 2013, 07:24:21 AM »

I'm not seeing any glitches ..

Random bits of green pixel leftovers, get your eyes checked

I thought it was intentional enemy corpses. WTF
Logged

Quarry
Level 10
*****



View Profile WWW
« Reply #18 on: September 22, 2013, 07:39:37 AM »

Yep, there are some .gif glitches. I recorded it as usual, but had to crop it with GIMP because it was too big. And it got glitched  Sad

design - classes
In order to increase replay value and variety my plan is to implement class selection.
When you start the game, after choosing difficulty you are greeted with a class selection screen. Every class has its own 3 weapons, its own smartbomb, and maybe other quirks.



1. Ranger
The classic Operation Carnage guy.
Health: medium.
Speed: medium.
> Machine gun: fast, low damage, fires in a straight line, infinite ammo
> Plasma gun: slow, very high damage, piercing, fires in a straight line, low ammo
> Flamethrower: fast, high damage, piercing, fires in a cone, very low ammo, shields from incoming bullets
+ Scatter bomb: deploys a lot of small explosive spherical bombs around the player

2. Commando
The heavyweight guy.
Health: high.
Speed: low.
> Shotgun: slow, medium damage, fires in a cone, infinite ammo, short range
> Earthsplitter: very slow, very high damage, piercing, fires in a straight line, very low ammo, causes explosion where it hits, destroys floor
> Chaingun: fast, high damage, fires in a cone, high ammo, shields from incoming bullets, slows the player down during usage
+ Shockwave: fires a 360° shockwave that deals less damage the further it travels - it isn't blocked by walls

3. Assassin
The fast guy with the double pistols. Fires in two directions!
Health: low.
Speed: fast.
> Hollow point bullets: fast, low damage, fires in a straight line, infinite ammo
> Pulse bullets: slow (charge and release), very high damage, piercing, fires in a straight line, very low ammo
> Acid spray: medium (first in bursts), high damage, piercing, fires in a cone, very low ammo, shields from incoming bullets
+ Gauntlet bomb: (similar to the .gif) deploys rotating blades around the player that deal high damage to enemies surrounding him

4. Knight
The melee guy. Has a rage meter or something that fills up with combos and stuff.
Health: high.
Speed: medium.
> Basic slash: slow (charge and release), shields from incoming bullets
> Fire slash: slow (charge and release), very high damage, piercing, fires in a straight line, medium ammo, shields from incoming bullets
> Energy boomerang: mediums speed, high damage, piercing, fires in a straight line, medium ammo - you have to wait for the boomerang to come back before being able to fire again
+ Lightning bomb: instant chain-lightning bomb that jumps between enemies


I think the commando is facing the wrong direction when holding the shotty, here is the fixed one with where I assumed they were looking at

Logged

 
vittorioromeo
Level 1
*



View Profile WWW Email
« Reply #19 on: September 22, 2013, 07:50:21 AM »

Whoops, you're right, thanks. I think the Knight suffers from the same issue :p
Logged

Pages: [1] 2 3 ... 5
Print
Jump to:  

Theme orange-lt created by panic