From e721e43cc19eafe67593e97378bc2b07eaf29782 Mon Sep 17 00:00:00 2001 From: Ashleigh Carr Date: Tue, 10 Dec 2019 17:42:57 +0000 Subject: [PATCH 1/8] Adds the cargoking achievement --- SQL/database_changelog.txt | 30 +++++++++++++++++++++--- SQL/tgstation_schema.sql | 10 ++++++++ SQL/tgstation_schema_prefixed.sql | 10 ++++++++ code/__HELPERS/roundend.dm | 14 +++++++++++ code/datums/achievements/achievements.dm | 16 +++++++++++++ 5 files changed, 77 insertions(+), 3 deletions(-) diff --git a/SQL/database_changelog.txt b/SQL/database_changelog.txt index e068891ad60a..adbdb69e34eb 100644 --- a/SQL/database_changelog.txt +++ b/SQL/database_changelog.txt @@ -1,15 +1,39 @@ Any time you make a change to the schema files, remember to increment the database schema version. Generally increment the minor number, major should be reserved for significant changes to the schema. Both values go up to 255. -The latest database version is 5.2; The query to update the schema revision table is: +The latest database version is 5.3; The query to update the schema revision table is: -INSERT INTO `schema_revision` (`major`, `minor`) VALUES (5, 2); +INSERT INTO `schema_revision` (`major`, `minor`) VALUES (5, 3); or -INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (5, 2); +INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (5, 3); In any query remember to add a prefix to the table names if you use one. ---------------------------------------------------- +version 5.3 10 Dec 2019, by Nichlas0010 + +Added two tables for achievements, one for the metadata and one for storing achieved achievements, as well as a misc table which is essentially just a glorified assoc list + +CREATE TABLE `achievements` ( + `name` VARCHAR(32) NOT NULL, + `id` INT UNSIGNED NOT NULL, + `descr` VARCHAR(2048) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB; + +CREATE TABLE `earned_achievements` ( + `ckey` VARCHAR(32) NOT NULL, + `id` INT UNSIGNED NOT NULL +) ENGINE=InnoDB; + +CREATE TABLE `misc` ( + `key` VARCHAR(32) NOT NULL, + `value` VARCHAR(2048) NOT NULL, + PRIMARY KEY (`key`) +) ENGINE=InnoDB; + +---------------------------------------------------- + Version 5.2, 28 Aug 2019, by AffectedArc07/TheGamer01 Added a field to the `player` table to track ckey and discord ID relationships diff --git a/SQL/tgstation_schema.sql b/SQL/tgstation_schema.sql index d2ec10e21e9a..c2f37e6256d4 100644 --- a/SQL/tgstation_schema.sql +++ b/SQL/tgstation_schema.sql @@ -534,6 +534,16 @@ CREATE TABLE `earned_achievements` ( `id` INT UNSIGNED NOT NULL ) ENGINE=InnoDB; +-- +-- Table structure for table `achievements` +-- +DROP TABLE IF EXISTS `misc`; +CREATE TABLE `misc` ( + `key` VARCHAR(32) NOT NULL, + `value` VARCHAR(2048) NOT NULL, + PRIMARY KEY (`key`) +) ENGINE=InnoDB; + /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; diff --git a/SQL/tgstation_schema_prefixed.sql b/SQL/tgstation_schema_prefixed.sql index fa879f92be2c..85e82db33897 100644 --- a/SQL/tgstation_schema_prefixed.sql +++ b/SQL/tgstation_schema_prefixed.sql @@ -534,6 +534,16 @@ CREATE TABLE `SS13_earned_achievements` ( `id` INT UNSIGNED NOT NULL ) ENGINE=InnoDB; +-- +-- Table structure for table `achievements` +-- +DROP TABLE IF EXISTS `SS13_misc`; +CREATE TABLE `SS13_misc` ( + `key` VARCHAR(32) NOT NULL, + `value` VARCHAR(2048) NOT NULL, + PRIMARY KEY (`key`) +) ENGINE=InnoDB; + /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 3f421c8421b5..b64cf0ebfdf4 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -590,3 +590,17 @@ return qdel(query_update_everything_ranks) qdel(query_check_everything_ranks) + +/datum/controller/subsystem/ticker/proc/cargoking() + var/datum/achievement/cargoking/CK = SSachievements.get_achievement(/datum/achievement/cargoking) + if(SSshuttle.points > CK.amount) //Why is the cargo budget on SSshuttle instead of SSeconomy :thinking: + var/hasQM = FALSE //we only wanna update the record if there's a QM + for(var/mob/M in GLOB.player_list) + if(M.mind && M.mind.assigned_role && M.mind.assigned_role == "Quartermaster") + SSachievements.unlock_achievement(/datum/achievement/cargoking, M.client) + hasQM = TRUE //there might be more than one QM, so we do the DB stuff outside of the loop + if(hasQM) + var/datum/DBQuery/Q = SSdbcore.New("UPDATE [format_table_name("misc")] SET value = '[SSshuttle.points]' WHERE key = 'cargorecord'") + Q.Execute() + qdel(Q) + diff --git a/code/datums/achievements/achievements.dm b/code/datums/achievements/achievements.dm index 074b916aa8ce..0fea9c71dd57 100644 --- a/code/datums/achievements/achievements.dm +++ b/code/datums/achievements/achievements.dm @@ -93,3 +93,19 @@ desc = "Get cremated... alive" id = 17 hidden = TRUE + +/datum/achievement/cargoking + name = "King of Credits" + desc = "As the QM, beat the current record of cargo credits: " //theoretically, if someone manages to get to an amount that's larger than 1992 digits, this'd break DB things since there's on + id = 20 + var/amount + +/datum/achievement/cargoking/New() + .=..() + var/datum/DBQuery/Q = SSdbcore.NewQuery("SELECT value FROM [format_table_name("misc")] WHERE key = 'cargorecord'") + Q.Execute() + amount = Q.item[1] + qdel(Q) + desc += amount + var/datum/callback/callbackevent = CALLBACK(SSticker, /datum/controller/subsystem/ticker.proc/cargoking) + SSticker.round_end_events += callbackevent From 2b9ca049ce839c4329461a713713c8a49db83e66 Mon Sep 17 00:00:00 2001 From: Ashleigh Carr Date: Tue, 10 Dec 2019 18:04:12 +0000 Subject: [PATCH 2/8] lol --- code/datums/achievements/achievements.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/datums/achievements/achievements.dm b/code/datums/achievements/achievements.dm index 0fea9c71dd57..ad23823412a2 100644 --- a/code/datums/achievements/achievements.dm +++ b/code/datums/achievements/achievements.dm @@ -98,13 +98,14 @@ name = "King of Credits" desc = "As the QM, beat the current record of cargo credits: " //theoretically, if someone manages to get to an amount that's larger than 1992 digits, this'd break DB things since there's on id = 20 - var/amount + var/amount = 0 /datum/achievement/cargoking/New() .=..() var/datum/DBQuery/Q = SSdbcore.NewQuery("SELECT value FROM [format_table_name("misc")] WHERE key = 'cargorecord'") Q.Execute() - amount = Q.item[1] + if(Q.item && Q.item[1]) + amount = Q.item[1] qdel(Q) desc += amount var/datum/callback/callbackevent = CALLBACK(SSticker, /datum/controller/subsystem/ticker.proc/cargoking) From f90e46277d4aa4ef4ed1eaf35cd9c215592e501d Mon Sep 17 00:00:00 2001 From: Nichlas Pihl Date: Wed, 11 Dec 2019 09:55:11 +0000 Subject: [PATCH 3/8] Update achievements.dm --- code/datums/achievements/achievements.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/achievements/achievements.dm b/code/datums/achievements/achievements.dm index ad23823412a2..dae4d87824c4 100644 --- a/code/datums/achievements/achievements.dm +++ b/code/datums/achievements/achievements.dm @@ -104,7 +104,7 @@ .=..() var/datum/DBQuery/Q = SSdbcore.NewQuery("SELECT value FROM [format_table_name("misc")] WHERE key = 'cargorecord'") Q.Execute() - if(Q.item && Q.item[1]) + if(Q.item.len) amount = Q.item[1] qdel(Q) desc += amount From fb73d3a575890b5e43f31aab8ad0b2f93e5db9f3 Mon Sep 17 00:00:00 2001 From: Nichlas Pihl Date: Wed, 11 Dec 2019 10:06:52 +0000 Subject: [PATCH 4/8] Update achievements.dm --- code/datums/achievements/achievements.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/achievements/achievements.dm b/code/datums/achievements/achievements.dm index dae4d87824c4..fcf2d583326a 100644 --- a/code/datums/achievements/achievements.dm +++ b/code/datums/achievements/achievements.dm @@ -107,6 +107,6 @@ if(Q.item.len) amount = Q.item[1] qdel(Q) - desc += amount + desc += "[amount]" var/datum/callback/callbackevent = CALLBACK(SSticker, /datum/controller/subsystem/ticker.proc/cargoking) SSticker.round_end_events += callbackevent From 107241d2f036d5b9692a64edebcda636502e26d2 Mon Sep 17 00:00:00 2001 From: Ashleigh Carr Date: Wed, 11 Dec 2019 22:14:39 +0000 Subject: [PATCH 5/8] fixes shit? --- code/__HELPERS/roundend.dm | 3 +++ code/datums/achievements/achievements.dm | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index b64cf0ebfdf4..84dc347a4c50 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -192,6 +192,9 @@ //Set news report and mode result mode.set_round_result() + // Check whether the cargo king achievement was achieved + cargoking() + send2irc("Server", "Round just ended.") if(length(CONFIG_GET(keyed_list/cross_server))) diff --git a/code/datums/achievements/achievements.dm b/code/datums/achievements/achievements.dm index fcf2d583326a..9b84f7d15f1f 100644 --- a/code/datums/achievements/achievements.dm +++ b/code/datums/achievements/achievements.dm @@ -107,6 +107,10 @@ if(Q.item.len) amount = Q.item[1] qdel(Q) +<<<<<<< HEAD + desc += amount +======= desc += "[amount]" var/datum/callback/callbackevent = CALLBACK(SSticker, /datum/controller/subsystem/ticker.proc/cargoking) SSticker.round_end_events += callbackevent +>>>>>>> fb73d3a575890b5e43f31aab8ad0b2f93e5db9f3 From 7e8eae847741574cc3d0404830f2ca374b6d031e Mon Sep 17 00:00:00 2001 From: Ashleigh Carr Date: Wed, 11 Dec 2019 22:39:17 +0000 Subject: [PATCH 6/8] woops --- code/datums/achievements/achievements.dm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/code/datums/achievements/achievements.dm b/code/datums/achievements/achievements.dm index 9b84f7d15f1f..1d4a2a2238c8 100644 --- a/code/datums/achievements/achievements.dm +++ b/code/datums/achievements/achievements.dm @@ -107,10 +107,4 @@ if(Q.item.len) amount = Q.item[1] qdel(Q) -<<<<<<< HEAD desc += amount -======= - desc += "[amount]" - var/datum/callback/callbackevent = CALLBACK(SSticker, /datum/controller/subsystem/ticker.proc/cargoking) - SSticker.round_end_events += callbackevent ->>>>>>> fb73d3a575890b5e43f31aab8ad0b2f93e5db9f3 From 1024c456f0b59af68c64b3e93eb0eaed37480035 Mon Sep 17 00:00:00 2001 From: Nichlas Pihl Date: Thu, 12 Dec 2019 11:35:12 +0000 Subject: [PATCH 7/8] Update achievements.dm --- code/datums/achievements/achievements.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/achievements/achievements.dm b/code/datums/achievements/achievements.dm index 1d4a2a2238c8..afce5161827a 100644 --- a/code/datums/achievements/achievements.dm +++ b/code/datums/achievements/achievements.dm @@ -107,4 +107,4 @@ if(Q.item.len) amount = Q.item[1] qdel(Q) - desc += amount + desc += "[amount]" From 5984ea9eb2d94dbd8778bc585dcfca61b41d3aca Mon Sep 17 00:00:00 2001 From: Nichlas Pihl Date: Thu, 19 Dec 2019 16:21:23 +0000 Subject: [PATCH 8/8] adds the ducat duke achievement --- code/__HELPERS/roundend.dm | 28 +++++++++++++++--------- code/datums/achievements/achievements.dm | 9 ++++++-- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 84dc347a4c50..3a7fbe7e3c3f 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -596,14 +596,22 @@ /datum/controller/subsystem/ticker/proc/cargoking() var/datum/achievement/cargoking/CK = SSachievements.get_achievement(/datum/achievement/cargoking) - if(SSshuttle.points > CK.amount) //Why is the cargo budget on SSshuttle instead of SSeconomy :thinking: - var/hasQM = FALSE //we only wanna update the record if there's a QM - for(var/mob/M in GLOB.player_list) - if(M.mind && M.mind.assigned_role && M.mind.assigned_role == "Quartermaster") - SSachievements.unlock_achievement(/datum/achievement/cargoking, M.client) - hasQM = TRUE //there might be more than one QM, so we do the DB stuff outside of the loop - if(hasQM) - var/datum/DBQuery/Q = SSdbcore.New("UPDATE [format_table_name("misc")] SET value = '[SSshuttle.points]' WHERE key = 'cargorecord'") - Q.Execute() - qdel(Q) + var/cargoking = FALSE + var/ducatduke = FALSE + if(SSshuttle.points > 1000000)//Why is the cargo budget on SSshuttle instead of SSeconomy :thinking: + ducatduke = TRUE + if(SSshuttle.points > CK.amount) + cargoking = TRUE + var/hasQM = FALSE //we only wanna update the record if there's a QM + for(var/mob/M in GLOB.player_list) + if(M.mind && M.mind.assigned_role && M.mind.assigned_role == "Quartermaster") + if(ducatduke) + SSachievements.unlock_achievement(/datum/achievement/ducatduke, M.client) + if(cargoking) + SSachievements.unlock_achievement(/datum/achievement/cargoking, M.client) + hasQM = TRUE //there might be more than one QM, so we do the DB stuff outside of the loop + if(hasQM && cargoking) + var/datum/DBQuery/Q = SSdbcore.New("UPDATE [format_table_name("misc")] SET value = '[SSshuttle.points]' WHERE key = 'cargorecord'") + Q.Execute() + qdel(Q) diff --git a/code/datums/achievements/achievements.dm b/code/datums/achievements/achievements.dm index 86987536ce2e..257d9b8ab9c0 100644 --- a/code/datums/achievements/achievements.dm +++ b/code/datums/achievements/achievements.dm @@ -108,7 +108,7 @@ /datum/achievement/cargoking name = "King of Credits" - desc = "As the QM, beat the current record of cargo credits: " //theoretically, if someone manages to get to an amount that's larger than 1992 digits, this'd break DB things since there's on + desc = "As the QM, beat the current record of cargo credits: " //theoretically, if someone manages to get to an amount that's larger than 1992 digits, this'd break DB things id = 20 var/amount = 0 @@ -119,4 +119,9 @@ if(Q.item.len) amount = Q.item[1] qdel(Q) - desc += "[amount]" \ No newline at end of file + desc += "[amount]" + +/datum/achievement/ducatduke + name = "Duke of Ducats" + desc = "As the QM, have a million cargo credits by the end of the round" //Cargoking-junior + id = 21