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

Login with username, password and session length

 
Advanced search

997709 Posts in 39118 Topics- by 30522 Members - Latest Member: ISODev

April 16, 2014, 07:59:24 AM
TIGSource ForumsFeedbackDevLogsoperation bloodshed
Pages: [1] 2 3 ... 6
Print
Author Topic: operation bloodshed  (Read 4317 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
*****



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
*****



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
*****



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

I'm not seeing any glitches ..
Logged

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

Theme orange-lt created by panic