diff options
-rw-r--r-- | src/GameInitDispose.cpp | 16 | ||||
-rw-r--r-- | src/GameLoop.cpp | 10 | ||||
-rw-r--r-- | src/GameTick.cpp | 7 | ||||
-rw-r--r-- | src/Globals.cpp | 9 | ||||
-rw-r--r-- | src/Person.cpp | 207 | ||||
-rw-r--r-- | src/Person.h | 1 | ||||
-rw-r--r-- | src/Skeleton.h | 2 | ||||
-rw-r--r-- | src/Support.cpp | 9 | ||||
-rw-r--r-- | src/Support.h | 13 | ||||
-rw-r--r-- | src/config.h | 10 | ||||
-rw-r--r-- | src/config.zig | 3 | ||||
-rw-r--r-- | src/misc.h | 1 | ||||
-rw-r--r-- | src/misc.zig | 9 |
13 files changed, 110 insertions, 187 deletions
diff --git a/src/GameInitDispose.cpp b/src/GameInitDispose.cpp index c4e1518..57dca01 100644 --- a/src/GameInitDispose.cpp +++ b/src/GameInitDispose.cpp @@ -54,13 +54,7 @@ extern float precipitationvert; extern float precipitationdensity; extern float soundscalefactor; extern int slomo; -extern int forwardskey; -extern int backwardskey; -extern int leftkey; -extern int rightkey; -extern int aimkey; -extern int psychicaimkey; -extern int psychickey; +extern struct Key keymap; void resizeWindow(Game* game, int width, int height) { @@ -80,13 +74,7 @@ Game* makeGame(Config config, Scores scores) game->musictoggle = config.music; game->mouse_sensitivity = config.mouse_sensitivity; - forwardskey = config.key.forwards; - backwardskey = config.key.backwards; - leftkey = config.key.left; - rightkey = config.key.right; - aimkey = config.key.aim; - psychicaimkey = config.key.psychic_aim; - psychickey = config.key.psychic; + keymap = config.key; game->levels = config.levels.ptr; game->nummissions = config.levels.len; diff --git a/src/GameLoop.cpp b/src/GameLoop.cpp index 06d4e90..8a1af59 100644 --- a/src/GameLoop.cpp +++ b/src/GameLoop.cpp @@ -32,9 +32,7 @@ extern float rad2deg; extern Fog fog; extern int environment; extern int slomo; -extern int aimkey; -extern int psychicaimkey; -extern int psychickey; +extern struct Key keymap; void handleKey(Game* game, int key, int action, int mods) { @@ -81,9 +79,9 @@ void handleKey(Game* game, int key, int action, int mods) && player.reloads[player.whichgun] > 0 && player.reloading <= 0) player.ammo = -1; - } else if (key == aimkey) { + } else if (key == keymap.aim) { player.aiming ^= 1; - } else if (key == psychicaimkey) { + } else if (key == keymap.psychic_aim) { // Picking up gun from rag doll if (player.currentanimation == crouchanim && (!player.aiming || player.whichgun == nogun @@ -125,7 +123,7 @@ void handleKey(Game* game, int key, int action, int mods) alSourcef(gSourceID[shootsong], AL_PITCH, 0.5f); alSourcef(gSourceID[zombiesong], AL_PITCH, 0.5f); } - } else if (key == psychickey) { + } else if (key == keymap.psychic) { if (visions ^= 1) { game->flashamount = game->flashr = 1; game->flashg = game->flashb = 0; diff --git a/src/GameTick.cpp b/src/GameTick.cpp index 42af2a6..f3ce015 100644 --- a/src/GameTick.cpp +++ b/src/GameTick.cpp @@ -43,13 +43,6 @@ extern float snowdelay; extern float precipitationdensity; extern float soundscalefactor; extern int slomo; -extern int forwardskey; -extern int backwardskey; -extern int leftkey; -extern int rightkey; -extern int aimkey; -extern int psychicaimkey; -extern int psychickey; extern Decals decals; #define maxfallvel 40 diff --git a/src/Globals.cpp b/src/Globals.cpp index dba8ad5..a22955b 100644 --- a/src/Globals.cpp +++ b/src/Globals.cpp @@ -3,6 +3,7 @@ #include "Models.h" #include "Person.h" #include "Game.h" +#include "config.h" float sinefluct; float sinefluctprog; @@ -40,13 +41,7 @@ float camerashake; Fog fog; -int forwardskey; -int backwardskey; -int leftkey; -int rightkey; -int aimkey; -int psychicaimkey; -int psychickey; +struct Key keymap; bool blood; diff --git a/src/Person.cpp b/src/Person.cpp index 3789865..d096b1d 100644 --- a/src/Person.cpp +++ b/src/Person.cpp @@ -23,6 +23,7 @@ #include "Person.h" #include "Support.h" +#include "config.h" #include "misc.h" extern float multiplier; @@ -38,13 +39,7 @@ extern Sprites sprites; extern float soundscalefactor; extern int slomo; -extern int forwardskey; -extern int backwardskey; -extern int leftkey; -extern int rightkey; -extern int aimkey; -extern int psychicaimkey; -extern int psychickey; +extern struct Key keymap; extern Model skeletonmodels[10]; extern Costume costume[10]; @@ -629,136 +624,100 @@ void Person::DoAnimationslite(int who) currentframe = targetframe; } -void Person::DoStuff(int who){ - int moveanim; +void Person::control() +{ + if (visions) + speed = 40; + else + speed = (targetanimation == joganim) ? 2.2 : 2.5; - if((targetanimation!=idleanim&&targetanimation!=crouchanim)||visions==1)playerlowrotation=playerrotation; - if(targetanimation!=crouchanim&¤tanimation!=crouchanim){ - if(playerrotation>playerlowrotation+50){playerlowrotation=playerrotation-50; targetanimation=walkanim; targetframe=0; target=0;} - if(playerrotation<playerlowrotation-50){playerlowrotation=playerrotation+50; targetanimation=walkanim; targetframe=0; target=0;} + if (keyPress(GLFW_KEY_LEFT_CONTROL) + && currentanimation == idleanim + && targetanimation == idleanim) { + targetanimation = crouchanim; + target = 0; } - if(targetanimation==crouchanim||currentanimation==crouchanim){ - if(playerrotation>playerlowrotation+70){playerrotation=playerlowrotation+70;} - if(playerrotation<playerlowrotation-70){playerrotation=playerlowrotation-70;} + if (!keyPress(GLFW_KEY_LEFT_CONTROL) + && currentanimation == crouchanim + && targetanimation == crouchanim) { + targetanimation = idleanim; + target = 0; } - if(who==0)camera.rotation=180-playerrotation; - if(who!=0&&visions==0){ - if(targetanimation!=walkanim&&targetanimation!=zombiewalkanim)speed=1.0*speedmult; - if(targetanimation==walkanim||targetanimation==zombiewalkanim)speed=1.8*speedmult; - playerlowrotation=playerrotation; + auto forwards = keyPress(keymap.forwards) - keyPress(keymap.backwards); + auto right = keyPress(keymap.right) - keyPress(keymap.left); + if ((onground || visions) && currentanimation != crouchanim) { + playerlowrotation -= right * (forwards ? forwards * 45 : 90); + backwardsanim = forwards < 0; + auto moveanim = (keyPress(GLFW_KEY_LEFT_SHIFT) || visions) + ? joganim : walkanim; // Should jog be the default? + if (forwards || right) { + if (targetanimation != moveanim) { + targetanimation = moveanim; + targetframe = 0; + } + } else { + if (targetanimation == joganim + || (targetanimation == walkanim + && targetframe != 0 && targetframe != 2)) { + targetanimation = idleanim; + targetframe = 0; + target = 0; + } + } } - //Do controls - if(who==0&&targetanimation!=diveanim&&targetanimation!=throwanim&&targetanimation!=thrownanim&¤tanimation!=diveanim&¤tanimation!=getupfrontanim){ - backwardsanim=0; - if(visions==1)speed=40; - if(visions==0&&targetanimation==joganim)speed=2.2; - if(visions==0&&targetanimation!=joganim)speed=1.3; - if(visions==0&&targetanimation==walkanim)speed=2.5; + // Air? What does this even do? + if (!onground && (forwards || right)) { + auto rotation = playerrotation + - right * (forwards ? forwards * 45 : 90); + facing = DoRotation({0, 0, 1}, 0, rotation, 0); + velocity += facing * multiplier * 4; + } +} - if (IsKeyDown(GLFW_KEY_LEFT_SHIFT) || visions == 1) - moveanim = joganim; - else - moveanim=walkanim; - if (IsKeyDown(GLFW_KEY_LEFT_CONTROL) - && currentanimation == idleanim - && targetanimation == idleanim) { - targetanimation = crouchanim; +void Person::DoStuff(int who) +{ + if (targetanimation != idleanim && targetanimation != crouchanim || visions) + playerlowrotation = playerrotation; + if (targetanimation != crouchanim && currentanimation != crouchanim) { + if (playerrotation > playerlowrotation + 50) { + playerlowrotation = playerrotation - 50; + targetanimation = walkanim; + targetframe = 0; target = 0; - } - if (!IsKeyDown(GLFW_KEY_LEFT_CONTROL) - && currentanimation == crouchanim - && targetanimation == crouchanim) { - targetanimation = idleanim; + } else if (playerrotation < playerlowrotation - 50) { + playerlowrotation = playerrotation + 50; + targetanimation = walkanim; + targetframe = 0; target = 0; } - if((onground||(who==0&&visions==1))&¤tanimation!=crouchanim){ - if (IsKeyDown(forwardskey) && !IsKeyDown(backwardskey)) { - if(targetanimation!=moveanim)targetframe=0; - targetanimation=moveanim; - } - if (IsKeyDown(rightkey) && !IsKeyDown(leftkey)) { - if(targetanimation!=moveanim)targetframe=0; - targetanimation=moveanim; - playerlowrotation-=90; - if (IsKeyDown(forwardskey)) - playerlowrotation += 45; - if (IsKeyDown(backwardskey)) - playerlowrotation -= 235; - } - if (IsKeyDown(leftkey) && !IsKeyDown(rightkey)) { - if(targetanimation!=moveanim)targetframe=0; - targetanimation=moveanim; - playerlowrotation+=90; - if (IsKeyDown(forwardskey)) - playerlowrotation -= 45; - if (IsKeyDown(backwardskey)) - playerlowrotation += 235; - } - if (IsKeyDown(backwardskey)) { - if(targetanimation!=moveanim)targetframe=0; - targetanimation=moveanim; - backwardsanim=1; - } - } - //air control - if(!onground){ - float oldplayerrotation=playerrotation; - if (IsKeyDown(forwardskey) && !IsKeyDown(backwardskey)) { - facing=0; - facing.z=1; - facing=DoRotation(facing,0,playerrotation,0); - velocity=velocity+facing*multiplier*4; - } - if (IsKeyDown(rightkey) && !IsKeyDown(leftkey)) { - playerrotation-=90; - if (IsKeyDown(forwardskey)) - playerrotation += 45; - if (IsKeyDown(backwardskey)) - playerrotation -= 45; - facing=0; - facing.z=1; - facing=DoRotation(facing,0,playerrotation,0); - velocity=velocity+facing*multiplier*4; - } - if (IsKeyDown(leftkey) && !IsKeyDown(rightkey)) { - playerrotation+=90; - if (IsKeyDown(forwardskey)) - playerrotation -= 45; - if (IsKeyDown(backwardskey)) - playerrotation += 45; - facing=0; - facing.z=1; - facing=DoRotation(facing,0,playerrotation,0); - velocity=velocity+facing*multiplier*4; - } - if (IsKeyDown(backwardskey) && !IsKeyDown(forwardskey) - && !IsKeyDown(leftkey) && !IsKeyDown(rightkey)) { - playerrotation+=180; - facing=0; - facing.z=1; - facing=DoRotation(facing,0,playerrotation,0); - velocity=velocity+facing*multiplier*4; - } - playerrotation=oldplayerrotation; - } - if (!IsKeyDown(forwardskey) && !IsKeyDown(leftkey) - && !IsKeyDown(rightkey) && !IsKeyDown(backwardskey) - && (targetanimation==joganim||targetanimation==walkanim)) { - if(!(targetanimation==walkanim&&(targetframe==0||targetframe==2))){ - targetanimation=idleanim; - targetframe=0; - target=0; - } - } + } else if (playerrotation > playerlowrotation + 70) { + playerrotation = playerlowrotation + 70; + } else if (playerrotation < playerlowrotation - 70) { + playerrotation = playerlowrotation - 70; } - facing=0; - facing.z=1; + if (who == 0) + camera.rotation = 180 - playerrotation; + + if(who!=0&&visions==0){ + if(targetanimation!=walkanim&&targetanimation!=zombiewalkanim)speed=1.0*speedmult; + if(targetanimation==walkanim||targetanimation==zombiewalkanim)speed=1.8*speedmult; + playerlowrotation=playerrotation; + } - facing=DoRotation(facing,0,playerlowrotation,0); - if(backwardsanim)facing*=-1; + // Do controls + if (who == 0 && targetanimation != diveanim + && targetanimation != throwanim + && targetanimation != thrownanim + && currentanimation != diveanim + && currentanimation != getupfrontanim) + control(); + + facing = DoRotation({0, 0, 1}, 0, playerlowrotation, 0); + if (backwardsanim) + facing *= -1; if(onground){ velocity=0; diff --git a/src/Person.h b/src/Person.h index 840876d..516ecf9 100644 --- a/src/Person.h +++ b/src/Person.h @@ -126,6 +126,7 @@ class Person void FindRotationGun(XYZ start, XYZ target); int DrawSkeleton(int who); + void control(); void DoStuff(int who); void DoAnimations(int who); void DoAnimationslite(int who); diff --git a/src/Skeleton.h b/src/Skeleton.h index 7687610..c8c41df 100644 --- a/src/Skeleton.h +++ b/src/Skeleton.h @@ -82,7 +82,7 @@ class Muscle class Animation { public: - size_t numframes; + int numframes; bool canbeoverridden; bool ismodified[max_joints][max_frames]; XYZ position[max_joints][max_frames]; diff --git a/src/Support.cpp b/src/Support.cpp index 850d0bb..2f24e94 100644 --- a/src/Support.cpp +++ b/src/Support.cpp @@ -1,17 +1,8 @@ -#include <stdbool.h> #include <stdlib.h> -#include <GLFW/glfw3.h> - #include "Support.h" int Random() { return (rand() % 65535) - 32767; } - -bool IsKeyDown(int key) -{ - const auto window = glfwGetCurrentContext(); - return glfwGetKey(window, key) == GLFW_PRESS; -} diff --git a/src/Support.h b/src/Support.h index 8fbe1d8..a5683ec 100644 --- a/src/Support.h +++ b/src/Support.h @@ -1,17 +1,4 @@ #ifndef SUPPORT_H #define SUPPORT_H - -#include <stdio.h> -#include <unistd.h> - -#define fsFromStart SEEK_SET - -typedef char* Str255; -typedef int OSErr; - -#define SetFPos(fildes, whence, offset) lseek(fildes, offset, whence) -#define FSClose(fildes) close(fildes) - int Random(); -bool IsKeyDown(int key); #endif diff --git a/src/config.h b/src/config.h index f4ed20d..486a4f6 100644 --- a/src/config.h +++ b/src/config.h @@ -14,6 +14,11 @@ struct Level { float difficulty; }; +struct Key { + int forwards, backwards, left, right; + int aim, psychic_aim, psychic; +}; + struct Config { int width; int height; @@ -24,10 +29,7 @@ struct Config { bool music; float mouse_sensitivity; - struct { - int forwards, backwards, left, right; - int aim, psychic_aim, psychic; - } key; + struct Key key; struct { struct Level *ptr; diff --git a/src/config.zig b/src/config.zig index 64785f8..eec36d7 100644 --- a/src/config.zig +++ b/src/config.zig @@ -18,13 +18,12 @@ const Dir = std.fs.Dir; const File = std.fs.File; -const Key = gfz.Key; +const Key = @import("gfz").Key; const allocator = std.heap.c_allocator; const c = @import("main.zig").c; const cwd = std.fs.cwd; const data_dir = @import("build_options").data_dir; const eql = std.mem.eql; -const gfz = @import("gfz"); const ini = @import("ini"); const join = std.fs.path.join; const maxInt = std.math.maxInt; diff --git a/src/misc.h b/src/misc.h index be5570a..7a377f6 100644 --- a/src/misc.h +++ b/src/misc.h @@ -55,6 +55,7 @@ struct Scores { #ifdef __cplusplus extern "C" { #endif // __cplusplus + bool keyPress(int key); struct AnimationData loadAnimation(const char*); void loadJoints(struct JointData*); struct ModelData loadModel(const char*); diff --git a/src/misc.zig b/src/misc.zig index e30c154..678538b 100644 --- a/src/misc.zig +++ b/src/misc.zig @@ -25,6 +25,8 @@ usingnamespace @cImport({ const Dir = std.fs.Dir; const TokenIterator = std.mem.TokenIterator; +const Key = gf.Key; +const Window = gf.Window; const al = @import("zeal"); const allocPrint = std.fmt.allocPrint; const allocator = std.heap.c_allocator; @@ -35,6 +37,7 @@ const data_dir = @import("build_options").data_dir ++ [_]u8{ sep }; const endsWith = std.mem.endsWith; const eql = std.mem.eql; const free = std.c.free; +const gf = @import("gfz"); const ini = @import("ini"); const join = std.fs.path.joinZ; const hash = std.crypto.hash.Blake3.hash; @@ -47,6 +50,12 @@ const startsWith = std.mem.startsWith; const std = @import("std"); const tokenize = std.mem.tokenize; +/// Return whether the given keyboard key is pressed. +export fn keyPress(key: c_int) bool { + const window = (Window.getCurrent() catch unreachable).?; + return (window.getKey(@intToEnum(Key, key)) catch unreachable) == .press; +} + /// Read given file to heap, allocated by C allocator. fn readFile(dir: Dir, comptime fmt: []const u8, args: anytype) ![]const u8 { const filename = try allocPrint(allocator, fmt, args); |