From 8d95d0a674c7cdd7feb05953e72bee5462ee69f8 Mon Sep 17 00:00:00 2001 From: Jeremy Rand Date: Fri, 28 May 2021 00:03:04 -0400 Subject: [PATCH] Bump the version to 1.9 since this is work towards v2.0. Add the structs for the messages to a server side high score list. Add the hash tool to the boot image for network testing. The requests will use hashes to validate that they come from the game. --- BuGS.xcodeproj/project.pbxproj | 6 ++ .../xcschemes/xcschememanagement.plist | 4 +- BuGS/globalScores.c | 81 ++++++++++++++++++ BuGS/globalScores.h | 21 +++++ BuGS/main.c | 8 +- BuGS/main.rez | 6 +- BuGS/make/system601_net.2mg | Bin 10485824 -> 10485824 bytes 7 files changed, 114 insertions(+), 12 deletions(-) create mode 100644 BuGS/globalScores.c create mode 100644 BuGS/globalScores.h diff --git a/BuGS.xcodeproj/project.pbxproj b/BuGS.xcodeproj/project.pbxproj index 0e2172c..750eb69 100644 --- a/BuGS.xcodeproj/project.pbxproj +++ b/BuGS.xcodeproj/project.pbxproj @@ -20,6 +20,7 @@ 9D1716A52491C49300C83148 /* system601.2mg in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D1716A42491C49300C83148 /* system601.2mg */; }; 9D1716A72491C49300C83148 /* tail.mk in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D1716A62491C49300C83148 /* tail.mk */; }; 9D1716AA2491C49300C83148 /* BuGS.xcscheme in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D1716A92491C49300C83148 /* BuGS.xcscheme */; }; + 9DB90E80265AD04A003461C1 /* globalScores.c in Sources */ = {isa = PBXBuildFile; fileRef = 9DB90E7F265AD04A003461C1 /* globalScores.c */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -122,6 +123,8 @@ 9DB1505324C9E54C00558B87 /* gameSpider.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = gameSpider.s; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.asm.orcam; }; 9DB1505424D3BF6C00558B87 /* gameSegments.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = gameSegments.s; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.asm.orcam; }; 9DB1505524D3BFCE00558B87 /* global.macros */ = {isa = PBXFileReference; lastKnownFileType = text; path = global.macros; sourceTree = ""; }; + 9DB90E7E265AD04A003461C1 /* globalScores.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = globalScores.h; sourceTree = ""; }; + 9DB90E7F265AD04A003461C1 /* globalScores.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = globalScores.c; sourceTree = ""; }; 9DC4D7BD24B7652100BACF4B /* ship.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = ship.s; sourceTree = ""; }; 9DC4D7BE24B80C9600BACF4B /* shot.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = shot.s; sourceTree = ""; }; /* End PBXFileReference section */ @@ -200,6 +203,8 @@ children = ( 9D17168E2491C49300C83148 /* main.c */, 9D1716902491C49300C83148 /* main.h */, + 9DB90E7E265AD04A003461C1 /* globalScores.h */, + 9DB90E7F265AD04A003461C1 /* globalScores.c */, 9D8FFC602491CA28005C9327 /* game.s */, 9D8FFC612491CAF0005C9327 /* game.h */, 9DB1505024C3801100558B87 /* gameFlea.s */, @@ -390,6 +395,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 9DB90E80265AD04A003461C1 /* globalScores.c in Sources */, 9D1716942491C49300C83148 /* Makefile in Sources */, 9D17168F2491C49300C83148 /* main.c in Sources */, ); diff --git a/BuGS.xcodeproj/xcuserdata/jrand.xcuserdatad/xcschemes/xcschememanagement.plist b/BuGS.xcodeproj/xcuserdata/jrand.xcuserdatad/xcschemes/xcschememanagement.plist index c7870af..dc9e153 100644 --- a/BuGS.xcodeproj/xcuserdata/jrand.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/BuGS.xcodeproj/xcuserdata/jrand.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ Binary.xcscheme_^#shared#^_ orderHint - 1 + 3 BuGS.xcscheme_^#shared#^_ @@ -22,7 +22,7 @@ doNotBuild.xcscheme_^#shared#^_ orderHint - 3 + 1 diff --git a/BuGS/globalScores.c b/BuGS/globalScores.c new file mode 100644 index 0000000..173bac8 --- /dev/null +++ b/BuGS/globalScores.c @@ -0,0 +1,81 @@ +/* + * globalScores.c + * BuGS + * + * Created by Jeremy Rand on 2021-05-23. + * Copyright © 2021 Jeremy Rand. All rights reserved. + */ + +#include +#include +#include + +#include "globalScores.h" + + +#define REQUEST_TYPE_GET_HIGH_SCORES 0 +#define REQUEST_TYPE_SET_SCORE 1 + +#define RESPONSE_TYPE_HELLO 0 +#define RESPONSE_TYPE_SCORES 1 +#define RESPONSE_TYPE_STATUS 2 + + +typedef struct tSessionSecrets { + uint32_t secret; + uint32_t nonce; +} tSessionSecrets; + + +typedef struct tHighScoreRequest { + uint16_t requestType; +} tHighScoreRequest; + + +typedef struct tHighScoreRequestWithHash { + tHighScoreRequest highScoreRequest; + uint8_t md5Digest[16]; +} tHighScoreRequestWithHash; + + +typedef struct tSetHighScoreRequest { + uint16_t requestType; + char who[4]; + uint32_t score; + Boolean is60Hz; +} tSetHighScoreRequest; + + +typedef struct tSetHighScoreRequestWithHash { + tSetHighScoreRequest setHighScoreRequest; + uint8_t md5Digest[16]; +} tSetHighScoreRequestWithHash; + + +typedef struct tHelloResponse { + uint16_t responseType; + uint32_t nonce; +} tHelloResponse; + + +typedef struct tScoresResponse { + uint16_t responseType; + tHighScore highScores[10]; +} tScoresResponse; + + +typedef struct tStatusResponse { + uint16_t responseType; + Boolean success; +} tStatusResponse; + + +#if 0 +Word blah(void) +{ + // This is how to read the 50 or 60 Hz indicator: + // 0 is 60 Hz + // 1 is 50 Hz + return ReadBParam(hrtz50or60); +} +#endif diff --git a/BuGS/globalScores.h b/BuGS/globalScores.h new file mode 100644 index 0000000..2134a91 --- /dev/null +++ b/BuGS/globalScores.h @@ -0,0 +1,21 @@ +/* + * globalScores.h + * BuGS + * + * Created by Jeremy Rand on 2021-05-23. + * Copyright © 2021 Jeremy Rand. All rights reserved. + */ + +#ifndef _GUARD_PROJECTBuGS_FILEglobalScores_ +#define _GUARD_PROJECTBuGS_FILEglobalScores_ + + +typedef struct tHighScore +{ + char scoreText[10]; + char who[4]; + unsigned long score; +} tHighScore; + + +#endif /* define _GUARD_PROJECTBuGS_FILEglobalScores_ */ diff --git a/BuGS/main.c b/BuGS/main.c index cd15994..b43cabc 100644 --- a/BuGS/main.c +++ b/BuGS/main.c @@ -20,6 +20,7 @@ #include "main.h" #include "game.h" +#include "globalScores.h" #include "tileData.h" @@ -33,13 +34,6 @@ /* Typedefs */ -typedef struct tHighScore -{ - char scoreText[10]; - char who[4]; - unsigned long score; -} tHighScore; - typedef struct tSettingsData { char magic[4]; diff --git a/BuGS/main.rez b/BuGS/main.rez index 97d8dc1..35f08e8 100644 --- a/BuGS/main.rez +++ b/BuGS/main.rez @@ -62,9 +62,9 @@ resource rUpdateInfo (UPDATE_INFO, $0000) { resource rVersion (1) { { 1, /* Major version number in BCD */ - 0, /* Minor version number in BCD */ - 1, /* Bug version number in BCD */ - release, /* Development phase */ + 9, /* Minor version number in BCD */ + 0, /* Bug version number in BCD */ + alpha, /* Development phase */ 0 /* Release number */ }, verUS, diff --git a/BuGS/make/system601_net.2mg b/BuGS/make/system601_net.2mg index 546cb29017b2c153494f99b5d5d0967c08603b05..ad7867bedc7a1bed40789b74d744d919d854b14d 100644 GIT binary patch delta 176351 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 z5#R`L1ULd50geDifFr;W;0SO8I0762jsQo1Bft^h2yg^A0vrL307rl$z!BgGa0EC4 z90861M}Q;15#R`L1ULd50geDifFr;W;0SO8I0762jsQo1Bft^h2yg^A0vrL307rl$ zz!BgGa0EC490861M}Q;15#R`L1ULd50geDifFr;W;0SO8I0762jsQo1Bft^h2yg^A z0vrL307rl$z!BgGa0EC490861M}Q;15#R`L1ULd50geDifFr;W;0SO8I0762jsQo1 zBft^h2yg^A0vrL307rl$z!BgGa0EC490861M}Q;15#R`L1ULd50geDifFr;W;0SO8 zI0762jsQo1Bft^h2yg^A0vrL307rl$z!BgGa0EC490861M}Q;15#R`L1ULd50geDi zfFr;W;0SO8I0762jsQo1Bft^h2yg^A0vrL307rl$z!BgGa0EC490861M}Q;15#R`L z1ULd50geDifFr;W;0SO8I0762jsQo1Bft^h2yg^A0vrL307rl$z!BgGa0EC490861 zM}Q;15#R`L1ULd50geDifFr;W;0SO8I0762jsQo1Bft^h2yg^A0vrL307rl$z!BgG za0EC490861M}Q;15#R`L1ULd50geDifFr;W;0SO8I0762jsQo1Bft^h2yg^A0vrL3 z07rl$z!BgGa0EC490861M}Q;15#R`L1ULd50geDifFr;W;0SO8I0762jsQo1Bft^h z2yg^A0vrL307rl$z!BgGa0EC490861M}Q;15#R`L1ULd50geDifFr;W;0SO8I0762 zjsQo1Bft^h2yg^A0vrL307rl$z!BgGa0EC490861M}Q;15#R`L1ULd50geDifFr;W u;0SO8I0762jsQo1Bft^h2yg^A0vrL307rl$z!BgGa0EC4|F0s@)$)JQ$mR$D delta 56006 zcmeIwy>A<39KiAC9G{c8PJMCemxh;6rzypNNt`%wJozeNaMnUE@?=nzstLLdergp?vPAe03O2}abpnUGl0F2IEPdwj9G^iTK>U+eDYdvtf7 zd-iYNw)dqUHiE%>nQU_VjbKg=;>qnh!S}n9J=^{@?Ct+P77D0|y+_ez=u>AR98gp0 zd-anl2DZ;9@)s{hmGv;Lc2#Jt)vPu3bvb_!R|zYmFKM^F^3HKN&#Q{Em#fWH{oZKz zbXN`OORMg=M!8}xc$k+3wp%Y(&%N8Zco4p3?UhpB<>e{D$&U|LwhmV;DIg69=n=%CVHnD5v{g6*cHKn~mw2xwb#p?G5tZ_=ALXbjAFz8JJf+ z8Whg>gZ`35&mZ)buRrK5 znVs7-gPs18*?jlycAng2vFKlsuul39pUZz@CO`Jq- z((9aezVz;;VkxgZ82)ps(r~0vDJG3cC#1NPkdjhLIw_4y&q&Wo&q>cq6VeOPsZOPl zK0B0%%U&@!5q~RXb=_TGQ{GKCJ!#$W?z-uzTWaKJKLwYxt1I%%vf1RtYpvytdP{Gb z-DfoIYOTJZRjhlOu!d`OeIZ+}R<$x$7){%JXRVHPad%ZAb