Skip to content
This repository was archived by the owner on May 22, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
fe0d1b2
probably converts achievements to datums and adds database supports
AshCorr Nov 15, 2019
c444547
fix description of bubblegum achievement
AshCorr Nov 15, 2019
8bdad43
renames SSmedals to SSachievements
AshCorr Nov 15, 2019
8cd71ad
adds apostrophes around SQL value
AshCorr Nov 15, 2019
bff20c5
possibly creates the schemas?
AshCorr Nov 15, 2019
e6faaef
forgot semicolons
AshCorr Nov 15, 2019
79c0b6e
changes ckey to name
AshCorr Nov 15, 2019
5a800d0
adds desc to the database as well
AshCorr Nov 15, 2019
dbd5f4c
forgot the id
AshCorr Nov 15, 2019
3d6337c
fuck
AshCorr Nov 15, 2019
340f669
fixes an apostrophe
AshCorr Nov 15, 2019
a391e95
I happen to be a moron
AshCorr Nov 15, 2019
57eceeb
adds a cache of achievements to reduce DB calls
AshCorr Nov 16, 2019
a29033f
backend ui
AshCorr Nov 16, 2019
ff3662b
fucking tgui
Amelia0010 Nov 17, 2019
f12c53b
adds a return so you can't check achivements while they're initializing
Amelia0010 Nov 17, 2019
09f81d0
I have no clue how to make tgui work
Amelia0010 Nov 17, 2019
102644f
why the fuck won't it work
Amelia0010 Nov 17, 2019
b740554
removes client var for the achievement browser
Amelia0010 Nov 17, 2019
98e65c1
fuck
Amelia0010 Nov 17, 2019
29b32a1
thank fucking monster for being the only person who could make this work
Amelia0010 Nov 17, 2019
d31e8a9
fuck
Amelia0010 Nov 17, 2019
5275546
Adds a list for all the achievements earned during the round
Amelia0010 Nov 19, 2019
b8db723
Makes it a local variable
Amelia0010 Nov 19, 2019
aba09cb
gets rid of shuttle_purchase_requirements_met on SSshuttles, since it…
Amelia0010 Nov 19, 2019
8529237
Update achievements.ract
Amelia0010 Nov 19, 2019
a6abb7f
Update viewer.dm
Amelia0010 Nov 19, 2019
c50c6e8
Update viewer.dm
Amelia0010 Nov 19, 2019
eeaeca6
holy fuck it works
AshCorr Nov 19, 2019
8cce52f
cdfhjksfvgasdfhav
AshCorr Nov 19, 2019
85edddd
Update tgstation_schema.sql
Amelia0010 Nov 20, 2019
89e590f
Update tgstation_schema_prefixed.sql
Amelia0010 Nov 20, 2019
733583b
Update achievements.dm
Amelia0010 Nov 20, 2019
8747041
Update achievements.dm
Amelia0010 Nov 20, 2019
64f5b8a
I don't get why this doesn't work as is, but oh well
AshCorr Nov 21, 2019
b69c17b
Merge branch 'achievements1' of https://github.com/yogstation13/Yogst…
AshCorr Nov 21, 2019
731a40d
fuck
AshCorr Nov 21, 2019
0851b65
fixes my stupid asshattery
AshCorr Nov 21, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions SQL/tgstation_schema.sql
Original file line number Diff line number Diff line change
Expand Up @@ -514,6 +514,25 @@ CREATE TABLE `stickyban_matched_cid` (
PRIMARY KEY (`stickyban`, `matched_cid`)
) ENGINE=InnoDB;

--
-- Table structure for table `achievements`
--
DROP TABLE IF EXISTS `achievements`;
CREATE TABLE `achievements` (
`name` VARCHAR(32) NOT NULL,
`id` INT UNSIGNED NOT NULL,
`descr` VARCHAR(2048) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;

--
-- Table structure for table `earned_achievements`
--
DROP TABLE IF EXISTS `earned_achievements`;
CREATE TABLE `earned_achievements` (
`ckey` VARCHAR(32) NOT NULL,
`id` INT UNSIGNED NOT NULL
) ENGINE=InnoDB;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
Expand Down
18 changes: 18 additions & 0 deletions SQL/tgstation_schema_prefixed.sql
Original file line number Diff line number Diff line change
Expand Up @@ -514,7 +514,25 @@ CREATE TABLE `SS13_stickyban_matched_cid` (
PRIMARY KEY (`stickyban`, `matched_cid`)
) ENGINE=InnoDB;

--
-- Table structure for table `SS13_achievements`
--
DROP TABLE IF EXISTS `SS13_achievements`;
CREATE TABLE `SS13_achievements` (
`name` VARCHAR(32) NOT NULL,
`id` INT UNSIGNED NOT NULL,
`descr` VARCHAR(2048) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;

--
-- Table structure for table `SS13_earned_achievements`
--
DROP TABLE IF EXISTS `SS13_earned_achievements`;
CREATE TABLE `SS13_earned_achievements` (
`ckey` VARCHAR(32) NOT NULL,
`id` INT UNSIGNED NOT NULL
) ENGINE=InnoDB;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
Expand Down
32 changes: 0 additions & 32 deletions code/__DEFINES/medal.dm

This file was deleted.

86 changes: 86 additions & 0 deletions code/controllers/subsystem/achievements.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
SUBSYSTEM_DEF(achievements)
name = "Achievements"
flags = SS_NO_FIRE
var/list/achievements = list()
var/list/cached_achievements = list()
var/list/browsers = list()
var/list/achievementsEarned = list()

/datum/controller/subsystem/achievements/Initialize(timeofday)
for(var/i in subtypesof(/datum/achievement))
var/datum/achievement/A = i
achievements[A] = initial(A.id)

var/datum/DBQuery/medalQuery = SSdbcore.NewQuery("SELECT name, descr FROM [format_table_name("achievements")] WHERE id = '[initial(A.id)]'")
medalQuery.Execute()
if(!medalQuery.NextRow())
var/datum/DBQuery/medalQuery2 = SSdbcore.NewQuery("INSERT INTO [format_table_name("achievements")] (name, id, descr) VALUES ('[initial(A.name)]', '[initial(A.id)]', '[initial(A.desc)]')")
medalQuery2.Execute()
qdel(medalQuery2)
else if(medalQuery.item[1] != initial(A.name) || medalQuery.item[2] != initial(A.desc))
var/datum/DBQuery/medalQuery2 = SSdbcore.NewQuery("UPDATE [format_table_name("achievements")] SET name = '[initial(A.name)]', descr = '[initial(A.desc)]' WHERE id = '[initial(A.id)]'")
medalQuery2.Execute()
qdel(medalQuery2)

qdel(medalQuery)


var/datum/DBQuery/ridOldChieves = SSdbcore.NewQuery("SELECT id FROM [format_table_name("achievements")]")
ridOldChieves.Execute()
while(ridOldChieves.NextRow())
var/id = text2num(ridOldChieves.item[1])
var/found_achievement = FALSE
for(var/I in achievements)
var/datum/achievement/A = I
if(initial(A.id) != id)
to_chat(world, "[initial(A.id)] [id]")
continue
found_achievement = TRUE
if(!found_achievement)
log_sql("Old achievement [id] found in database, removing")
var/datum/DBQuery/getRidOfOldStuff = SSdbcore.NewQuery("DELETE FROM [format_table_name("achievements")] WHERE id = '[id]'")
getRidOfOldStuff.Execute()
var/datum/DBQuery/ridTheOtherTableAsWell = SSdbcore.NewQuery("DELETE FROM [format_table_name("earned_achievements")] WHERE id = '[id]'")
ridTheOtherTableAsWell.Execute()
qdel(ridTheOtherTableAsWell)
qdel(getRidOfOldStuff)

qdel(ridOldChieves)
return ..()

/datum/controller/subsystem/achievements/proc/unlock_achievement(datum/achievement/achievement, client/C)
if(!achievements[achievement])
log_sql("Achievement [initial(achievement.name)] not found in list of achievements when trying to unlock for [C.ckey]")
return FALSE
if(!has_achievement(achievement, C))
var/datum/DBQuery/medalQuery = SSdbcore.NewQuery("INSERT INTO [format_table_name("earned_achievements")] (ckey, id) VALUES ('[C.ckey]', '[initial(achievement.id)]')")
medalQuery.Execute()
qdel(medalQuery)
cached_achievements[C.ckey] += achievement
if(!achievementsEarned[C.ckey])
achievementsEarned[C.ckey] = list()
achievementsEarned[C.ckey] += achievement
return TRUE

/datum/controller/subsystem/achievements/proc/has_achievement(datum/achievement/achievement, client/C)
if(!achievements[achievement])
log_sql("Achievement [initial(achievement.name)] not found in list of achievements when checking for [C.ckey]")
if(!cached_achievements[C.ckey])
cache_achievements(C)

return (achievement in cached_achievements[C.ckey])

/datum/controller/subsystem/achievements/proc/cache_achievements(client/C)
var/datum/DBQuery/cacheQuery = SSdbcore.NewQuery("SELECT id FROM [format_table_name("earned_achievements")] WHERE ckey = '[C.ckey]'")
cacheQuery.Execute()
cached_achievements[C.ckey] = list()
while(cacheQuery.NextRow())
for(var/i in achievements)
if(achievements[i] == text2num(cacheQuery.item[1]))
cached_achievements[C.ckey] += i
break
qdel(cacheQuery)
return

/datum/controller/subsystem/achievements/proc/get_browser(client/C)
return browsers[C.ckey]
87 changes: 0 additions & 87 deletions code/controllers/subsystem/medals.dm

This file was deleted.

4 changes: 0 additions & 4 deletions code/controllers/subsystem/shuttle.dm
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ SUBSYSTEM_DEF(shuttle)

var/shuttle_purchased = FALSE //If the station has purchased a replacement escape shuttle this round
var/emag_shuttle_purchased = FALSE //If the traitors have purchased a replacement escape shuttle this round
var/list/shuttle_purchase_requirements_met = list() //For keeping track of ingame events that would unlock new shuttles, such as defeating a boss or discovering a secret item

var/lockdown = FALSE //disallow transit after nuke goes off

Expand Down Expand Up @@ -539,9 +538,6 @@ SUBSYSTEM_DEF(shuttle)
if (istype(SSshuttle.shuttle_loan))
shuttle_loan = SSshuttle.shuttle_loan

if (istype(SSshuttle.shuttle_purchase_requirements_met))
shuttle_purchase_requirements_met = SSshuttle.shuttle_purchase_requirements_met

var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
centcom_message = SSshuttle.centcom_message
ordernum = SSshuttle.ordernum
Expand Down
9 changes: 9 additions & 0 deletions code/datums/achievements/achievements.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/datum/achievement
var/name = "achievement"
var/desc = "Please make an issue on github, including this achievement's name and how you got it."
var/id = 0 //Should be incremented so every achievement has a unique ID

/datum/achievement/bubblegum
name = "Bubblegum Killer"
desc = "Eliminate a bubblegum" //Should be improved
id = 1
48 changes: 48 additions & 0 deletions code/datums/achievements/viewer.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
//UI adapted from https://github.com/tgstation/tgstation/pull/47058

/datum/achievement_browser
var/client/client

/datum/achievement_browser/New(client/C)
client = C

/datum/achievement_browser/proc/get_achievements()
var/list/A = list()
for(var/i in SSachievements.achievements)
A[i] = SSachievements.has_achievement(i, client)
return A

/datum/achievement_browser/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.always_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "achievements", "achievements", 450, 450, master_ui, state)
ui.open()

/datum/achievement_browser/ui_data(mob/user)
var/data = list("achievements" = list())
var/list/achievements = get_achievements()
for(var/B in achievements)
var/datum/achievement/achievement = B
var/list/A = list(
"name" = initial(achievement.name),
"desc" = initial(achievement.desc),
"unlocked" = achievements[achievement]
)
data["achievements"] += list(A)

return data

/client/verb/checkachievements()
set category = "OOC"
set name = "Check achievements"
set desc = "See all of your achivements"

if(!SSachievements.initialized)
to_chat(src, "<span class='warning'>SSachievements has not initialized yet, please wait.</span>")
return

var/datum/achievement_browser/achievement_browser = SSachievements.get_browser(src)
if(!achievement_browser)
achievement_browser = new(src)
SSachievements.browsers[ckey] = achievement_browser
achievement_browser.ui_interact(usr)
4 changes: 1 addition & 3 deletions code/datums/shuttles.dm
Original file line number Diff line number Diff line change
Expand Up @@ -237,9 +237,7 @@
emag_buy = TRUE

/datum/map_template/shuttle/emergency/arena/prerequisites_met()
if("bubblegum" in SSshuttle.shuttle_purchase_requirements_met)
return TRUE
return FALSE
return SSachievements.has_achievement(/datum/achievement/bubblegum, usr.client)

/datum/map_template/shuttle/emergency/birdboat
suffix = "birdboat"
Expand Down
5 changes: 0 additions & 5 deletions code/game/gamemodes/meteor/meteors.dm
Original file line number Diff line number Diff line change
Expand Up @@ -164,11 +164,6 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
/obj/effect/meteor/ex_act()
return

/obj/effect/meteor/examine(mob/user)
. = ..()
if(!(flags_1 & ADMIN_SPAWNED_1) && isliving(user))
SSmedals.UnlockMedal(MEDAL_METEOR, user.client)

/obj/effect/meteor/attackby(obj/item/I, mob/user, params)
if(I.tool_behaviour == TOOL_MINING)
make_debris()
Expand Down
1 change: 0 additions & 1 deletion code/game/machinery/computer/arcade.dm
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,6 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list(
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "arcade", /datum/mood_event/arcade)
if(prob(0.0001)) //1 in a million
new /obj/item/gun/energy/pulse/prize(src)
SSmedals.UnlockMedal(MEDAL_PULSE, user.client)

if(!contents.len)
var/prizeselect
Expand Down
11 changes: 0 additions & 11 deletions code/game/objects/structures/lavaland/necropolis_tendril.dm
Original file line number Diff line number Diff line change
Expand Up @@ -46,17 +46,6 @@ GLOBAL_LIST_INIT(tendrils, list())


/obj/structure/spawner/lavaland/Destroy()
var/last_tendril = TRUE
if(GLOB.tendrils.len>1)
last_tendril = FALSE

if(last_tendril && !(flags_1 & ADMIN_SPAWNED_1))
if(SSmedals.hub_enabled)
for(var/mob/living/L in view(7,src))
if(L.stat || !L.client)
continue
SSmedals.UnlockMedal("[BOSS_MEDAL_TENDRIL] [ALL_KILL_MEDAL]", L.client)
SSmedals.SetScore(TENDRIL_CLEAR_SCORE, L.client, 1)
GLOB.tendrils -= src
QDEL_NULL(emitted_light)
//QDEL_NULL(gps) //yogs - lol
Expand Down
1 change: 0 additions & 1 deletion code/modules/admin/admin_verbs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,6 @@ GLOBAL_PROTECT(admin_verbs_debug)
/client/proc/map_template_upload,
/client/proc/jump_to_ruin,
/client/proc/clear_dynamic_transit,
/client/proc/toggle_medal_disable,
/client/proc/view_runtimes,
/client/proc/pump_random_event,
/client/proc/cmd_display_init_log,
Expand Down
Loading