mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-26 05:27:01 +01:00
Karma refactor (#17070)
* Karma refactor * This too * Fixes recursion * Fixes bugs * Fixes bad usr * Update code/modules/karma/karma_holder.dm Co-authored-by: SteelSlayer <42044220+SteelSlayer@users.noreply.github.com> * Logic tweak Co-authored-by: SteelSlayer <42044220+SteelSlayer@users.noreply.github.com>
This commit is contained in:
co-authored by
SteelSlayer
parent
5e41a1e1d1
commit
ab92435be0
@@ -142,6 +142,9 @@ GLOBAL_PROTECT(log_end)
|
||||
/proc/log_tgui(text)
|
||||
rustg_log_write(GLOB.tgui_log, "[text][GLOB.log_end]")
|
||||
|
||||
/proc/log_karma(text)
|
||||
rustg_log_write(GLOB.karma_log, "[text][GLOB.log_end]")
|
||||
|
||||
#ifdef REFERENCE_TRACKING
|
||||
/proc/log_gc(text)
|
||||
rustg_log_write(GLOB.gc_log, "[text][GLOB.log_end]")
|
||||
|
||||
@@ -23,6 +23,8 @@ GLOBAL_VAR(chat_debug_log)
|
||||
GLOBAL_PROTECT(chat_debug_log)
|
||||
GLOBAL_VAR(round_id)
|
||||
GLOBAL_PROTECT(round_id)
|
||||
GLOBAL_VAR(karma_log)
|
||||
GLOBAL_PROTECT(karma_log)
|
||||
|
||||
#ifdef REFERENCE_TRACKING
|
||||
GLOBAL_VAR(gc_log)
|
||||
|
||||
@@ -266,7 +266,7 @@
|
||||
/datum/job/proc/would_accept_job_transfer_from_player(mob/player)
|
||||
if(!transfer_allowed)
|
||||
return FALSE
|
||||
if(!guest_jobbans(title)) // actually checks if job is a whitelisted position
|
||||
if(!check_job_karma(title))
|
||||
return TRUE
|
||||
if(!istype(player))
|
||||
return FALSE
|
||||
|
||||
@@ -100,7 +100,7 @@ GLOBAL_LIST_INIT(whitelisted_positions, list(
|
||||
))
|
||||
|
||||
|
||||
/proc/guest_jobbans(job)
|
||||
/proc/check_job_karma(job)
|
||||
return (job in GLOB.whitelisted_positions)
|
||||
|
||||
/proc/get_job_datums()
|
||||
|
||||
+14
-58
@@ -1,66 +1,22 @@
|
||||
/proc/is_job_whitelisted(mob/M, rank)
|
||||
if(guest_jobbans(rank))
|
||||
if(!GLOB.configuration.general.enable_karma)
|
||||
return TRUE
|
||||
if(check_rights(R_ADMIN, 0, M))
|
||||
return TRUE
|
||||
if(!SSdbcore.IsConnected())
|
||||
return FALSE
|
||||
else
|
||||
var/datum/db_query/job_read = SSdbcore.NewQuery(
|
||||
"SELECT job FROM whitelist WHERE ckey=:ckey",
|
||||
list("ckey" = M.ckey)
|
||||
)
|
||||
|
||||
if(!job_read.warn_execute(async = FALSE)) // Dont async this. Youll make roundstart slow.
|
||||
qdel(job_read)
|
||||
return FALSE
|
||||
|
||||
. = FALSE
|
||||
while(job_read.NextRow())
|
||||
var/joblist = job_read.item[1]
|
||||
if(joblist != "*")
|
||||
var/allowed_jobs = splittext(joblist, ",")
|
||||
if(rank in allowed_jobs)
|
||||
. = TRUE
|
||||
break
|
||||
else
|
||||
. = TRUE
|
||||
break
|
||||
|
||||
qdel(job_read)
|
||||
else
|
||||
if(!check_job_karma(rank)) // If it aint a karma job, let them play
|
||||
return TRUE
|
||||
if(!GLOB.configuration.general.enable_karma)
|
||||
return TRUE
|
||||
if(check_rights(R_ADMIN, FALSE, M))
|
||||
return TRUE
|
||||
if(rank in M.client.karmaholder.unlocked_jobs)
|
||||
return TRUE
|
||||
|
||||
/proc/is_alien_whitelisted(mob/M, species)
|
||||
return FALSE
|
||||
|
||||
/proc/can_use_species(mob/M, species)
|
||||
if(!GLOB.configuration.general.enable_karma)
|
||||
return TRUE
|
||||
if(species == "human" || species == "Human")
|
||||
return TRUE
|
||||
if(check_rights(R_ADMIN, 0))
|
||||
if(check_rights(R_ADMIN, FALSE))
|
||||
return TRUE
|
||||
if(!SSdbcore.IsConnected())
|
||||
return FALSE
|
||||
else
|
||||
var/datum/db_query/species_read = SSdbcore.NewQuery(
|
||||
"SELECT species FROM whitelist WHERE ckey=:ckey",
|
||||
list("ckey" = M.ckey)
|
||||
)
|
||||
|
||||
if(!species_read.warn_execute(async = FALSE)) // Dont async this one. It makes roundstart take 10 years.
|
||||
qdel(species_read)
|
||||
return FALSE
|
||||
|
||||
. = FALSE
|
||||
while(species_read.NextRow())
|
||||
var/specieslist = species_read.item[1]
|
||||
if(specieslist != "*")
|
||||
var/allowed_species = splittext(specieslist, ",")
|
||||
if(species in allowed_species)
|
||||
. = TRUE
|
||||
break
|
||||
else
|
||||
. = TRUE
|
||||
break
|
||||
|
||||
qdel(species_read)
|
||||
if(species in M.client.karmaholder.unlocked_species)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
@@ -119,7 +119,7 @@
|
||||
if("Body")
|
||||
var/list/race_list = list("Human", "Tajaran", "Skrell", "Unathi", "Diona", "Vulpkanin")
|
||||
for(var/species in GLOB.whitelisted_species)
|
||||
if(is_alien_whitelisted(H, species))
|
||||
if(can_use_species(H, species))
|
||||
race_list += species
|
||||
|
||||
var/datum/ui_module/appearance_changer/AC = ui_users[user]
|
||||
|
||||
@@ -248,6 +248,7 @@ GLOBAL_LIST_EMPTY(world_topic_handlers)
|
||||
GLOB.http_log = "[GLOB.log_directory]/http.log"
|
||||
GLOB.sql_log = "[GLOB.log_directory]/sql.log"
|
||||
GLOB.chat_debug_log = "[GLOB.log_directory]/chat_debug.log"
|
||||
GLOB.karma_log = "[GLOB.log_directory]/karma.log"
|
||||
start_log(GLOB.world_game_log)
|
||||
start_log(GLOB.world_href_log)
|
||||
start_log(GLOB.world_runtime_log)
|
||||
@@ -256,6 +257,7 @@ GLOBAL_LIST_EMPTY(world_topic_handlers)
|
||||
start_log(GLOB.http_log)
|
||||
start_log(GLOB.sql_log)
|
||||
start_log(GLOB.chat_debug_log)
|
||||
start_log(GLOB.karma_log)
|
||||
|
||||
#ifdef REFERENCE_TRACKING
|
||||
GLOB.gc_log = "[GLOB.log_directory]/gc_debug.log"
|
||||
|
||||
@@ -33,7 +33,7 @@ GLOBAL_DATUM_INIT(jobban_regex, /regex, regex("(\[\\S]+) - (\[^#]+\[^# ])(?: ##
|
||||
if(!M || !rank)
|
||||
return 0
|
||||
|
||||
if(GLOB.configuration.jobs.guest_job_ban && guest_jobbans(rank))
|
||||
if(GLOB.configuration.jobs.guest_job_ban && check_job_karma(rank))
|
||||
if(IsGuestKey(M.key))
|
||||
return "Guest Job-ban"
|
||||
|
||||
@@ -46,7 +46,7 @@ GLOBAL_DATUM_INIT(jobban_regex, /regex, regex("(\[\\S]+) - (\[^#]+\[^# ])(?: ##
|
||||
if(!ckey || !rank)
|
||||
return null
|
||||
|
||||
if(GLOB.configuration.jobs.guest_job_ban && guest_jobbans(rank))
|
||||
if(GLOB.configuration.jobs.guest_job_ban && check_job_karma(rank))
|
||||
if(IsGuestKey(ckey))
|
||||
return "Guest Job-ban"
|
||||
|
||||
|
||||
@@ -3522,51 +3522,22 @@
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
var/target_ckey = href_list["viewkarma"]
|
||||
|
||||
var/total_karma = 0
|
||||
var/spent_karma = 0
|
||||
var/unlocked_jobs = ""
|
||||
var/unlocked_species = ""
|
||||
// Get their totals
|
||||
var/datum/db_query/query_get_totals = SSdbcore.NewQuery("SELECT karma, karmaspent FROM karmatotals WHERE byondkey=:ckey", list(
|
||||
"ckey" = target_ckey
|
||||
))
|
||||
if(!query_get_totals.warn_execute())
|
||||
qdel(query_get_totals)
|
||||
var/client/C = GLOB.directory[href_list["viewkarma"]]
|
||||
if(!C)
|
||||
return
|
||||
// Even if there aint a row, we can still assume the defaults of 0 above
|
||||
if(query_get_totals.NextRow())
|
||||
total_karma = query_get_totals.item[1]
|
||||
spent_karma = query_get_totals.item[2]
|
||||
|
||||
qdel(query_get_totals)
|
||||
|
||||
// Now get their unlocks
|
||||
var/datum/db_query/query_get_unlocks = SSdbcore.NewQuery("SELECT job, species FROM whitelist WHERE ckey=:ckey", list(
|
||||
"ckey" = target_ckey
|
||||
))
|
||||
if(!query_get_unlocks.warn_execute())
|
||||
qdel(query_get_unlocks)
|
||||
return
|
||||
if(query_get_unlocks.NextRow())
|
||||
unlocked_jobs = query_get_unlocks.item[1]
|
||||
unlocked_species = query_get_unlocks.item[2]
|
||||
|
||||
qdel(query_get_unlocks)
|
||||
|
||||
// Pack it into a dat
|
||||
var/dat = {"
|
||||
<ul>
|
||||
<li>Total Karma: [total_karma]</li>
|
||||
<li>Spent Karma: [spent_karma]</li>
|
||||
<li>Available Karma: [total_karma - spent_karma]</li>
|
||||
<li>Unlocked Jobs: [unlocked_jobs]</li>
|
||||
<li>Unlocked Species: [unlocked_species]</li>
|
||||
<li>Total Karma: [C.karmaholder.karma_earned]</li>
|
||||
<li>Spent Karma: [C.karmaholder.karma_spent]</li>
|
||||
<li>Available Karma: [C.karmaholder.karma_earned - C.karmaholder.karma_spent]</li>
|
||||
<li>Unlocked Jobs: [C.karmaholder.unlocked_jobs.Join(", ")]</li>
|
||||
<li>Unlocked Species: [C.karmaholder.unlocked_species.Join(", ")]</li>
|
||||
</ul>
|
||||
"}
|
||||
|
||||
var/datum/browser/popup = new(usr, "view_karma", "Karma stats for [target_ckey]", 600, 300)
|
||||
var/datum/browser/popup = new(usr, "view_karma", "Karma stats for [C.ckey]", 600, 300)
|
||||
popup.set_content(dat)
|
||||
popup.open(FALSE)
|
||||
else if(href_list["who_advanced"])
|
||||
|
||||
@@ -56,9 +56,6 @@
|
||||
|
||||
var/global/obj/screen/click_catcher/void
|
||||
|
||||
var/karma_spent = 0
|
||||
var/karma_tab = 0
|
||||
|
||||
control_freak = CONTROL_FREAK_ALL | CONTROL_FREAK_SKIN | CONTROL_FREAK_MACROS
|
||||
|
||||
var/ip_intel = "Disabled"
|
||||
@@ -120,6 +117,9 @@
|
||||
/// List of the clients CUIs
|
||||
var/list/datum/custom_user_item/cui_entries = list()
|
||||
|
||||
/// The client's karma holder
|
||||
var/datum/karma_holder/karmaholder
|
||||
|
||||
/client/vv_edit_var(var_name, var_value)
|
||||
switch(var_name)
|
||||
// I know we will never be in a world where admins are editing client vars to let people bypass TOS
|
||||
@@ -129,4 +129,7 @@
|
||||
// Dont fuck with this
|
||||
if("cui_entries")
|
||||
return FALSE
|
||||
// or this
|
||||
if("karmaholder")
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
@@ -125,58 +125,6 @@
|
||||
if(GLOB.configuration.logging.href_logging)
|
||||
log_href("[src] (usr:[usr]\[[COORD(usr)]\]) : [hsrc ? "[hsrc] " : ""][href]")
|
||||
|
||||
if(href_list["karmashop"])
|
||||
if(!GLOB.configuration.general.enable_karma)
|
||||
to_chat(src, "Karma is disabled on this server.")
|
||||
return
|
||||
|
||||
switch(href_list["karmashop"])
|
||||
if("tab")
|
||||
karma_tab = text2num(href_list["tab"])
|
||||
karmashopmenu()
|
||||
return
|
||||
if("shop")
|
||||
if(href_list["KarmaBuy"])
|
||||
var/karma=verify_karma()
|
||||
if(isnull(karma)) //Doesn't display anything if karma database is down.
|
||||
return
|
||||
switch(href_list["KarmaBuy"])
|
||||
if("1")
|
||||
karma_purchase(karma,5,"job","Barber")
|
||||
if("2")
|
||||
karma_purchase(karma,5,"job","Brig Physician")
|
||||
if("3")
|
||||
karma_purchase(karma,30,"job","Nanotrasen Representative")
|
||||
if("4")
|
||||
karma_purchase(karma,30,"job","Blueshield")
|
||||
return
|
||||
if(href_list["KarmaBuy2"])
|
||||
var/karma=verify_karma()
|
||||
if(isnull(karma)) //Doesn't display anything if karma database is down.
|
||||
return
|
||||
switch(href_list["KarmaBuy2"])
|
||||
if("1")
|
||||
karma_purchase(karma,15,"species","Machine People","Machine")
|
||||
if("2")
|
||||
karma_purchase(karma,30,"species","Kidan")
|
||||
if("3")
|
||||
karma_purchase(karma,30,"species","Grey")
|
||||
if("4")
|
||||
karma_purchase(karma,45,"species","Vox")
|
||||
if("5")
|
||||
karma_purchase(karma,45,"species","Slime People")
|
||||
if("6")
|
||||
karma_purchase(karma,45,"species","Plasmaman")
|
||||
if("7")
|
||||
karma_purchase(karma,30,"species","Drask")
|
||||
return
|
||||
if(href_list["KarmaRefund"])
|
||||
var/type = href_list["KarmaRefundType"]
|
||||
var/job = href_list["KarmaRefund"]
|
||||
var/cost = href_list["KarmaRefundCost"]
|
||||
karmarefund(type,job,cost)
|
||||
return
|
||||
|
||||
switch(href_list["_src_"])
|
||||
if("holder") hsrc = holder
|
||||
if("usr") hsrc = mob
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
/datum/client_login_processor/karma_numbers
|
||||
priority = 42
|
||||
|
||||
/datum/client_login_processor/karma_numbers/get_query(client/C)
|
||||
var/datum/db_query/query = SSdbcore.NewQuery("SELECT karma, karmaspent FROM karmatotals WHERE byondkey=:ckey", list(
|
||||
"ckey" = C.ckey
|
||||
))
|
||||
return query
|
||||
|
||||
/datum/client_login_processor/karma_numbers/process_result(datum/db_query/Q, client/C)
|
||||
C.karmaholder = new()
|
||||
while(Q.NextRow())
|
||||
C.karmaholder.karma_earned = Q.item[1]
|
||||
C.karmaholder.karma_spent = Q.item[2]
|
||||
@@ -0,0 +1,20 @@
|
||||
/datum/client_login_processor/karma_unlocks
|
||||
priority = 43
|
||||
|
||||
/datum/client_login_processor/karma_unlocks/get_query(client/C)
|
||||
var/datum/db_query/query = SSdbcore.NewQuery("SELECT job, species FROM whitelist WHERE ckey=:ckey", list(
|
||||
"ckey" = C.ckey
|
||||
))
|
||||
return query
|
||||
|
||||
/datum/client_login_processor/karma_unlocks/process_result(datum/db_query/Q, client/C)
|
||||
while(Q.NextRow())
|
||||
// Lets split stuff apart
|
||||
C.karmaholder.unlocked_jobs = splittext(Q.item[1], ",")
|
||||
C.karmaholder.unlocked_species = splittext(Q.item[2], ",") // these should really be JSON
|
||||
|
||||
for(var/i in 1 to length(C.karmaholder.unlocked_jobs))
|
||||
C.karmaholder.unlocked_jobs[i] = trim(C.karmaholder.unlocked_jobs[i]) // Trim whitespace
|
||||
|
||||
for(var/i in 1 to length(C.karmaholder.unlocked_species))
|
||||
C.karmaholder.unlocked_species[i] = trim(C.karmaholder.unlocked_species[i]) // Trim whitespace
|
||||
@@ -220,7 +220,7 @@
|
||||
var/prev_species = active_character.species
|
||||
|
||||
for(var/_species in GLOB.whitelisted_species)
|
||||
if(is_alien_whitelisted(user, _species))
|
||||
if(can_use_species(user, _species))
|
||||
new_species += _species
|
||||
|
||||
active_character.species = input("Please select a species", "Character Generation", null) in sortTim(new_species, /proc/cmp_text_asc)
|
||||
|
||||
+22
-421
@@ -1,7 +1,4 @@
|
||||
/* KARMA
|
||||
Everything karma related is here.
|
||||
Part of karma purchase is handled in client_procs.dm */
|
||||
|
||||
// All karma procs that arent confined to the [/datum/karma_holder] are in here
|
||||
/proc/sql_report_karma(mob/spender, mob/receiver)
|
||||
var/receiverrole = "None"
|
||||
var/receiverspecial = "None"
|
||||
@@ -34,25 +31,25 @@
|
||||
|
||||
qdel(log_query)
|
||||
|
||||
var/datum/db_query/select_spender = SSdbcore.NewQuery("SELECT id, karma FROM karmatotals WHERE byondkey=:rkey", list(
|
||||
var/datum/db_query/select_recv = SSdbcore.NewQuery("SELECT id, karma FROM karmatotals WHERE byondkey=:rkey", list(
|
||||
"rkey" = receiver.ckey
|
||||
))
|
||||
|
||||
if(!select_spender.warn_execute())
|
||||
qdel(select_spender)
|
||||
if(!select_recv.warn_execute())
|
||||
qdel(select_recv)
|
||||
return
|
||||
|
||||
var/karma
|
||||
var/id
|
||||
while(select_spender.NextRow())
|
||||
id = select_spender.item[1]
|
||||
karma = text2num(select_spender.item[2])
|
||||
while(select_recv.NextRow())
|
||||
id = select_recv.item[1]
|
||||
karma = text2num(select_recv.item[2])
|
||||
|
||||
qdel(select_spender)
|
||||
qdel(select_recv)
|
||||
|
||||
// They dont exist, lets make them exist
|
||||
if(karma == null)
|
||||
karma = 1
|
||||
|
||||
var/datum/db_query/insert_query = SSdbcore.NewQuery("INSERT INTO karmatotals (byondkey, karma) VALUES (:rkey, :karma)", list(
|
||||
"rkey" = receiver.ckey,
|
||||
"karma" = karma
|
||||
@@ -60,7 +57,10 @@
|
||||
if(!insert_query.warn_execute())
|
||||
qdel(insert_query)
|
||||
return
|
||||
|
||||
qdel(insert_query)
|
||||
|
||||
// They do exist. Update it.
|
||||
else
|
||||
karma++
|
||||
var/datum/db_query/update_query = SSdbcore.NewQuery("UPDATE karmatotals SET karma=:karma WHERE id=:id", list(
|
||||
@@ -70,8 +70,11 @@
|
||||
if(!update_query.warn_execute())
|
||||
qdel(update_query)
|
||||
return
|
||||
|
||||
qdel(update_query)
|
||||
|
||||
receiver?.client.karmaholder.sync_karma(receiver) // Refresh their end
|
||||
|
||||
GLOBAL_LIST_EMPTY(karma_spenders)
|
||||
|
||||
// Returns TRUE if mob can give karma at all; if not, tells them why
|
||||
@@ -85,7 +88,7 @@ GLOBAL_LIST_EMPTY(karma_spenders)
|
||||
if(!SSticker || !GLOB.player_list.len || (SSticker.current_state == GAME_STATE_PREGAME))
|
||||
to_chat(src, "<span class='warning'>You can't award karma until the game has started.</span>")
|
||||
return FALSE
|
||||
if(client.karma_spent || (ckey in GLOB.karma_spenders))
|
||||
if(ckey in GLOB.karma_spenders)
|
||||
to_chat(src, "<span class='warning'>You've already spent your karma for the round.</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
@@ -162,7 +165,6 @@ GLOBAL_LIST_EMPTY(karma_spenders)
|
||||
return // Check again, just in case things changed while the alert box was up
|
||||
|
||||
to_chat(usr, "Good karma spent on [M.name].")
|
||||
client.karma_spent = TRUE
|
||||
GLOB.karma_spenders += ckey
|
||||
|
||||
var/special_role = "None"
|
||||
@@ -173,9 +175,9 @@ GLOBAL_LIST_EMPTY(karma_spenders)
|
||||
if(M.mind.assigned_role)
|
||||
assigned_role = M.mind.assigned_role
|
||||
|
||||
rustg_log_write("[GLOB.log_directory]/karma.log", "Karma awarded to [M.name] ([M.key]) (Role: [assigned_role] | Special: [special_role]) - Awarded by [ckey]")
|
||||
log_karma("Karma awarded to [M.name] ([M.key]) (Role: [assigned_role] | Special: [special_role]) - Awarded by [ckey]")
|
||||
|
||||
sql_report_karma(src, M)
|
||||
sql_report_karma(src, M) // This proc doesnt just report the purchase. It actually updates their balances.
|
||||
|
||||
/client/verb/check_karma()
|
||||
set name = "Check Karma"
|
||||
@@ -186,418 +188,17 @@ GLOBAL_LIST_EMPTY(karma_spenders)
|
||||
to_chat(src, "<span class='warning'>Karma is disabled.</span>")
|
||||
return
|
||||
|
||||
var/currentkarma = verify_karma()
|
||||
if(!isnull(currentkarma))
|
||||
to_chat(usr, {"<br>You have <b>[currentkarma]</b> available."})
|
||||
|
||||
/client/proc/verify_karma()
|
||||
var/currentkarma = 0
|
||||
if(!SSdbcore.IsConnected())
|
||||
to_chat(usr, "<span class='warning'>Unable to connect to karma database. Please try again later.<br></span>")
|
||||
return
|
||||
|
||||
var/datum/db_query/query = SSdbcore.NewQuery("SELECT karma, karmaspent FROM karmatotals WHERE byondkey=:ckey", list(
|
||||
"ckey" = ckey
|
||||
))
|
||||
if(!query.warn_execute())
|
||||
qdel(query)
|
||||
return
|
||||
|
||||
var/totalkarma
|
||||
var/karmaspent
|
||||
while(query.NextRow())
|
||||
totalkarma = query.item[1]
|
||||
karmaspent = query.item[2]
|
||||
qdel(query)
|
||||
currentkarma = (text2num(totalkarma) - text2num(karmaspent))
|
||||
|
||||
return currentkarma
|
||||
var/available_karma = karmaholder.karma_earned - karmaholder.karma_spent
|
||||
to_chat(usr, "You have ["<b>[available_karma]</b>" || "a database error. Contact the host if they are"] available.")
|
||||
|
||||
/client/verb/karmashop()
|
||||
set name = "karmashop"
|
||||
set desc = "Spend your hard-earned karma here"
|
||||
set desc = "Spend your karma here"
|
||||
set hidden = TRUE
|
||||
|
||||
if(!GLOB.configuration.general.enable_karma)
|
||||
to_chat(src, "<span class='warning'>Karma is disabled.</span>")
|
||||
return
|
||||
karmashopmenu()
|
||||
|
||||
/client/proc/karmashopmenu()
|
||||
var/datum/db_query/query = SSdbcore.NewQuery("SELECT ckey, job, species FROM whitelist WHERE ckey=:ckey", list(
|
||||
"ckey" = ckey
|
||||
))
|
||||
if(!query.warn_execute())
|
||||
qdel(query)
|
||||
return
|
||||
karmaholder.open_shop_menu()
|
||||
|
||||
var/list/joblist
|
||||
var/list/specieslist
|
||||
var/dbjob
|
||||
var/dbspecies
|
||||
var/dbckey
|
||||
while(query.NextRow())
|
||||
dbckey = query.item[1]
|
||||
dbjob = query.item[2]
|
||||
dbspecies = query.item[3]
|
||||
|
||||
qdel(query)
|
||||
|
||||
if(dbckey)
|
||||
joblist = splittext(dbjob,",")
|
||||
specieslist = splittext(dbspecies,",")
|
||||
|
||||
var/dat = "<html><body><center>"
|
||||
dat += "<a href='?src=[UID()];karmashop=tab;tab=0' [karma_tab == 0 ? "class='linkOn'" : ""]>Job Unlocks</a>"
|
||||
dat += "<a href='?src=[UID()];karmashop=tab;tab=1' [karma_tab == 1 ? "class='linkOn'" : ""]>Species Unlocks</a>"
|
||||
dat += "<a href='?src=[UID()];karmashop=tab;tab=2' [karma_tab == 2 ? "class='linkOn'" : ""]>Karma Refunds</a>"
|
||||
dat += "</center>"
|
||||
dat += "<HR>"
|
||||
|
||||
var/currentkarma = verify_karma()
|
||||
dat += "You have <b>[currentkarma]</b> available.<br><HR>"
|
||||
|
||||
switch(karma_tab)
|
||||
if(0) // Job Unlocks
|
||||
if(!("Barber" in joblist))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy=1'>Unlock Barber -- 5KP</a><br>"
|
||||
else
|
||||
dat += "Barber - <font color='green'>Unlocked</font><br>"
|
||||
if(!("Brig Physician" in joblist))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy=2'>Unlock Brig Physician -- 5KP</a><br>"
|
||||
else
|
||||
dat += "Brig Physician - <font color='green'>Unlocked</font><br>"
|
||||
if(!("Nanotrasen Representative" in joblist))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy=3'>Unlock Nanotrasen Representative -- 30KP</a><br>"
|
||||
else
|
||||
dat += "Nanotrasen Representative - <font color='green'>Unlocked</font><br>"
|
||||
if(!("Blueshield" in joblist))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy=4'>Unlock Blueshield -- 30KP</a><br>"
|
||||
else
|
||||
dat += "Blueshield - <font color='green'>Unlocked</font><br>"
|
||||
|
||||
if(1) // Species Unlocks
|
||||
if(!("Machine" in specieslist))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=1'>Unlock Machine People -- 15KP</a><br>"
|
||||
else
|
||||
dat += "Machine People - <font color='green'>Unlocked</font><br>"
|
||||
if(!("Kidan" in specieslist))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=2'>Unlock Kidan -- 30KP</a><br>"
|
||||
else
|
||||
dat += "Kidan - <font color='green'>Unlocked</font><br>"
|
||||
if(!("Grey" in specieslist))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=3'>Unlock Grey -- 30KP</a><br>"
|
||||
else
|
||||
dat += "Grey - <font color='green'>Unlocked</font><br>"
|
||||
if(!("Drask" in specieslist))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=7'>Unlock Drask -- 30KP</a><br>"
|
||||
else
|
||||
dat += "Drask - <font color='green'>Unlocked</font><br>"
|
||||
if(!("Vox" in specieslist))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=4'>Unlock Vox -- 45KP</a><br>"
|
||||
else
|
||||
dat += "Vox - <font color='green'>Unlocked</font><br>"
|
||||
if(!("Slime People" in specieslist))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=5'>Unlock Slime People -- 45KP</a><br>"
|
||||
else
|
||||
dat += "Slime People - <font color='green'>Unlocked</font><br>"
|
||||
if(!("Plasmaman" in specieslist))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=6'>Unlock Plasmaman -- 45KP</a><br>"
|
||||
else
|
||||
dat += "Plasmaman - <font color='green'>Unlocked</font><br>"
|
||||
|
||||
if(2) // Karma Refunds
|
||||
var/list/refundable = list()
|
||||
var/list/purchased = checkpurchased()
|
||||
if("Tajaran Ambassador" in purchased)
|
||||
refundable += "Tajaran Ambassador"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Tajaran Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Tajaran Ambassador -- 30KP</a><br>"
|
||||
if("Unathi Ambassador" in purchased)
|
||||
refundable += "Unathi Ambassador"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Unathi Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Unathi Ambassador -- 30KP</a><br>"
|
||||
if("Skrell Ambassador" in purchased)
|
||||
refundable += "Skrell Ambassador"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Skrell Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Skrell Ambassador -- 30KP</a><br>"
|
||||
if("Diona Ambassador" in purchased)
|
||||
refundable += "Diona Ambassador"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Diona Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Diona Ambassador -- 30KP</a><br>"
|
||||
if("Kidan Ambassador" in purchased)
|
||||
refundable += "Kidan Ambassador"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Kidan Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Kidan Ambassador -- 30KP</a><br>"
|
||||
if("Slime People Ambassador" in purchased)
|
||||
refundable += "Slime People Ambassador"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Slime People Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Slime People Ambassador -- 30KP</a><br>"
|
||||
if("Grey Ambassador" in purchased)
|
||||
refundable += "Grey Ambassador"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Grey Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Grey Ambassador -- 30KP</a><br>"
|
||||
if("Vox Ambassador" in purchased)
|
||||
refundable += "Vox Ambassador"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Vox Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Vox Ambassador -- 30KP</a><br>"
|
||||
if("Customs Officer" in purchased)
|
||||
refundable += "Customs Officer"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Customs Officer;KarmaRefundType=job;KarmaRefundCost=30'>Refund Customs Officer -- 30KP</a><br>"
|
||||
if("Nanotrasen Recruiter" in purchased)
|
||||
refundable += "Nanotrasen Recruiter"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Nanotrasen Recruiter;KarmaRefundType=job;KarmaRefundCost=10'>Refund Nanotrasen Recruiter -- 10KP</a><br>"
|
||||
if("Mechanic" in purchased)
|
||||
refundable += "Mechanic"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Mechanic;KarmaRefundType=job;KarmaRefundCost=30'>Refund Mechanic -- 30KP</a><br>"
|
||||
if("Security Pod Pilot" in purchased)
|
||||
refundable += "Security Pod Pilot"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Security Pod Pilot;KarmaRefundType=job;KarmaRefundCost=30'>Refund Security Pod Pilot -- 30KP</a><br>"
|
||||
if("Magistrate" in purchased)
|
||||
refundable += "Magistrate"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Magistrate;KarmaRefundType=job;KarmaRefundCost=45'>Refund Magistrate -- 45KP</a><br>"
|
||||
|
||||
if(!refundable.len)
|
||||
dat += "You do not have any refundable karma purchases.<br>"
|
||||
|
||||
dat += "<br><B>PLEASE NOTE THAT PEOPLE WHO TRY TO GAME THE KARMA SYSTEM WILL END UP ON THE WALL OF SHAME. THIS INCLUDES BUT IS NOT LIMITED TO TRADES, OOC KARMA BEGGING, CODE EXPLOITS, ETC.</B>"
|
||||
dat += "</center></body></html>"
|
||||
|
||||
var/datum/browser/popup = new(usr, "karmashop", "<div align='center'>Karma Shop</div>", 400, 400)
|
||||
popup.set_content(dat)
|
||||
popup.open(0)
|
||||
|
||||
//Checks if can afford, what you're purchasing, then purchases. (used in client_procs.dm)
|
||||
/client/proc/karma_purchase(karma = 0, price = 1, category, name, DBname = null)
|
||||
if(karma < price)
|
||||
to_chat(usr, "You do not have enough karma!")
|
||||
return
|
||||
if(alert("Are you sure you want to unlock [name]?", "Confirmation", "No", "Yes") != "Yes")
|
||||
return
|
||||
if(karma < price) //Check one more time. (definitely not repeated code)
|
||||
to_chat(usr, "You do not have enough karma!")
|
||||
return
|
||||
if(!isnull(DBname)) //In case database uses another name for logging. (Machine, Machine People)
|
||||
name = DBname
|
||||
if(category == "job")
|
||||
DB_job_unlock(name,price)
|
||||
karmashopmenu()
|
||||
else if(category == "species")
|
||||
DB_species_unlock(name,price)
|
||||
karmashopmenu()
|
||||
|
||||
/client/proc/DB_job_unlock(job, cost)
|
||||
var/datum/db_query/select_query = SSdbcore.NewQuery("SELECT ckey, job FROM whitelist WHERE ckey=:ckey", list(
|
||||
"ckey" = ckey
|
||||
))
|
||||
if(!select_query.warn_execute())
|
||||
qdel(select_query)
|
||||
return
|
||||
|
||||
var/dbjob
|
||||
var/dbckey
|
||||
while(select_query.NextRow())
|
||||
dbckey = select_query.item[1]
|
||||
dbjob = select_query.item[2]
|
||||
|
||||
qdel(select_query)
|
||||
if(!dbckey)
|
||||
var/datum/db_query/insert_query = SSdbcore.NewQuery("INSERT INTO whitelist (ckey, job) VALUES (:ckey, :job)", list(
|
||||
"ckey" = ckey,
|
||||
"job" = job
|
||||
))
|
||||
if(!insert_query.warn_execute())
|
||||
qdel(insert_query)
|
||||
return
|
||||
else
|
||||
to_chat(usr, "You have unlocked [job].")
|
||||
message_admins("[key_name(usr)] has unlocked [job].") // why do we admin log this
|
||||
karmacharge(cost)
|
||||
|
||||
qdel(insert_query)
|
||||
|
||||
if(dbckey)
|
||||
var/list/joblist = splittext(dbjob,",")
|
||||
if(!(job in joblist))
|
||||
joblist += job
|
||||
var/newjoblist = jointext(joblist,",")
|
||||
var/datum/db_query/update_query = SSdbcore.NewQuery("UPDATE whitelist SET job=:newjoblist WHERE ckey=:ckey", list(
|
||||
"newjoblist" = newjoblist,
|
||||
"ckey" = ckey
|
||||
))
|
||||
if(!update_query.warn_execute())
|
||||
qdel(update_query)
|
||||
return
|
||||
else
|
||||
to_chat(usr, "You have unlocked [job].")
|
||||
message_admins("[key_name(usr)] has unlocked [job].")
|
||||
karmacharge(cost)
|
||||
qdel(update_query)
|
||||
else
|
||||
to_chat(usr, "You already have this job unlocked!")
|
||||
return
|
||||
|
||||
/client/proc/DB_species_unlock(species, cost)
|
||||
var/datum/db_query/select_query = SSdbcore.NewQuery("SELECT ckey, species FROM whitelist WHERE ckey=:ckey", list(
|
||||
"ckey" = ckey
|
||||
))
|
||||
if(!select_query.warn_execute())
|
||||
qdel(select_query)
|
||||
return
|
||||
|
||||
var/dbspecies
|
||||
var/dbckey
|
||||
while(select_query.NextRow())
|
||||
dbckey = select_query.item[1]
|
||||
dbspecies = select_query.item[2]
|
||||
qdel(select_query)
|
||||
if(!dbckey)
|
||||
var/datum/db_query/insert_query = SSdbcore.NewQuery("INSERT INTO whitelist (ckey, species) VALUES (:ckey, :species)", list(
|
||||
"ckey" = ckey,
|
||||
"species" = species
|
||||
))
|
||||
if(!insert_query.warn_execute())
|
||||
qdel(insert_query)
|
||||
return
|
||||
else
|
||||
to_chat(usr, "You have unlocked [species].")
|
||||
message_admins("[key_name(usr)] has unlocked [species].")
|
||||
qdel(insert_query)
|
||||
karmacharge(cost)
|
||||
|
||||
if(dbckey)
|
||||
var/list/specieslist = splittext(dbspecies,",")
|
||||
if(!(species in specieslist))
|
||||
specieslist += species
|
||||
var/newspecieslist = jointext(specieslist,",")
|
||||
var/datum/db_query/update_query = SSdbcore.NewQuery("UPDATE whitelist SET species=:newspecieslist WHERE ckey=:ckey", list(
|
||||
"newspecieslist" = newspecieslist,
|
||||
"ckey" = ckey
|
||||
))
|
||||
if(!update_query.warn_execute())
|
||||
qdel(update_query)
|
||||
return
|
||||
else
|
||||
to_chat(usr, "You have unlocked [species].")
|
||||
message_admins("[key_name(usr)] has unlocked [species].")
|
||||
qdel(update_query)
|
||||
karmacharge(cost)
|
||||
else
|
||||
to_chat(usr, "You already have this species unlocked!")
|
||||
return
|
||||
|
||||
/client/proc/karmacharge(cost, refund = FALSE)
|
||||
var/datum/db_query/select_query = SSdbcore.NewQuery("SELECT karmaspent FROM karmatotals WHERE byondkey=:ckey", list(
|
||||
"ckey" = ckey
|
||||
))
|
||||
if(!select_query.warn_execute())
|
||||
qdel(select_query)
|
||||
return
|
||||
|
||||
while(select_query.NextRow())
|
||||
var/spent = text2num(select_query.item[1])
|
||||
if(refund)
|
||||
spent -= cost
|
||||
else
|
||||
spent += cost
|
||||
var/datum/db_query/update_query = SSdbcore.NewQuery("UPDATE karmatotals SET karmaspent=:spent WHERE byondkey=:ckey", list(
|
||||
"spent" = spent,
|
||||
"ckey" = ckey
|
||||
))
|
||||
if(!update_query.warn_execute())
|
||||
qdel(select_query)
|
||||
qdel(update_query)
|
||||
return
|
||||
else
|
||||
to_chat(usr, "You have been [refund ? "refunded" : "charged"] [cost] karma.")
|
||||
message_admins("[key_name(usr)] has been [refund ? "refunded" : "charged"] [cost] karma.")
|
||||
qdel(select_query)
|
||||
qdel(update_query)
|
||||
return
|
||||
|
||||
/client/proc/karmarefund(type, name, cost)
|
||||
switch(name)
|
||||
if("Tajaran Ambassador","Unathi Ambassador","Skrell Ambassador","Diona Ambassador","Kidan Ambassador",
|
||||
"Slime People Ambassador","Grey Ambassador","Vox Ambassador","Customs Officer", "Mechanic", "Security Pod Pilot")
|
||||
cost = 30
|
||||
if("Nanotrasen Recruiter")
|
||||
cost = 10
|
||||
if("Magistrate")
|
||||
cost = 45
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>That job is not refundable.</span>")
|
||||
return
|
||||
|
||||
var/datum/db_query/query = SSdbcore.NewQuery("SELECT ckey, job, species FROM whitelist WHERE ckey=:ckey", list(
|
||||
"ckey" = ckey
|
||||
))
|
||||
if(!query.warn_execute())
|
||||
qdel(query)
|
||||
return
|
||||
|
||||
var/dbjob
|
||||
var/dbspecies
|
||||
var/dbckey
|
||||
while(query.NextRow())
|
||||
dbckey = query.item[1]
|
||||
dbjob = query.item[2]
|
||||
dbspecies = query.item[3]
|
||||
|
||||
qdel(query)
|
||||
|
||||
if(dbckey)
|
||||
var/list/typelist = list()
|
||||
var/statement
|
||||
switch(type)
|
||||
if("job")
|
||||
typelist = splittext(dbjob,",")
|
||||
statement = "UPDATE whitelist SET job=:newtypelist WHERE ckey=:ckey"
|
||||
if("species")
|
||||
typelist = splittext(dbspecies,",")
|
||||
statement = "UPDATE whitelist SET species=:newtypelist WHERE ckey=:ckey"
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Type [type] is not a valid column.</span>")
|
||||
|
||||
if(name in typelist)
|
||||
typelist -= name
|
||||
var/newtypelist = jointext(typelist,",")
|
||||
var/datum/db_query/update_query = SSdbcore.NewQuery(statement, list(
|
||||
"ckey" = ckey,
|
||||
"newtypelist" = newtypelist
|
||||
))
|
||||
if(!update_query.warn_execute())
|
||||
qdel(update_query)
|
||||
return
|
||||
else
|
||||
to_chat(usr, "You have been refunded [cost] karma for [type] [name].")
|
||||
message_admins("[key_name(usr)] has been refunded [cost] karma for [type] [name].")
|
||||
qdel(update_query)
|
||||
karmacharge(text2num(cost),1)
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>You have not bought [name].</span>")
|
||||
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Your ckey ([dbckey]) was not found.</span>")
|
||||
|
||||
/client/proc/checkpurchased(name = null) // If the first parameter is null, return a full list of purchases
|
||||
var/datum/db_query/query = SSdbcore.NewQuery("SELECT ckey, job, species FROM whitelist WHERE ckey=:ckey", list(
|
||||
"ckey" = ckey
|
||||
))
|
||||
if(!query.warn_execute())
|
||||
qdel(query)
|
||||
return
|
||||
|
||||
var/dbjob
|
||||
var/dbspecies
|
||||
var/dbckey
|
||||
while(query.NextRow())
|
||||
dbckey = query.item[1]
|
||||
dbjob = query.item[2]
|
||||
dbspecies = query.item[3]
|
||||
|
||||
qdel(query)
|
||||
if(dbckey)
|
||||
var/list/joblist = splittext(dbjob,",")
|
||||
var/list/specieslist = splittext(dbspecies,",")
|
||||
var/list/combinedlist = joblist + specieslist
|
||||
if(name)
|
||||
if(name in combinedlist)
|
||||
return TRUE
|
||||
else
|
||||
return FALSE
|
||||
else
|
||||
return combinedlist
|
||||
else
|
||||
return FALSE
|
||||
|
||||
@@ -0,0 +1,423 @@
|
||||
// This file contains stuff regarding the karma holder datum
|
||||
// This is attached to a client and holds their info
|
||||
/datum/karma_holder
|
||||
/// List of jobs this person has unlocked
|
||||
var/list/unlocked_jobs = list()
|
||||
/// List of species this person has unlocked
|
||||
var/list/unlocked_species = list()
|
||||
/// Amount of karma earned total
|
||||
var/karma_earned = 0
|
||||
/// Amount of karma spent total
|
||||
var/karma_spent = 0
|
||||
/// What tab are they on
|
||||
var/karma_tab = 0
|
||||
|
||||
|
||||
// Safety stuff
|
||||
/datum/karma_holder/vv_edit_var(var_name, var_value)
|
||||
return FALSE // no
|
||||
|
||||
/datum/karma_holder/CanProcCall(procname)
|
||||
return FALSE // no
|
||||
|
||||
// Opens the karma shop menu
|
||||
/datum/karma_holder/proc/open_shop_menu()
|
||||
var/dat = "<html><body><center>"
|
||||
dat += "<a href='?src=[UID()];karmashop=tab;tab=0' [karma_tab == 0 ? "class='linkOn'" : ""]>Job Unlocks</a>"
|
||||
dat += "<a href='?src=[UID()];karmashop=tab;tab=1' [karma_tab == 1 ? "class='linkOn'" : ""]>Species Unlocks</a>"
|
||||
dat += "<a href='?src=[UID()];karmashop=tab;tab=2' [karma_tab == 2 ? "class='linkOn'" : ""]>Karma Refunds</a>"
|
||||
dat += "</center>"
|
||||
dat += "<HR>"
|
||||
|
||||
var/currentkarma = (karma_earned - karma_spent)
|
||||
dat += "You have <b>[currentkarma]</b> available.<br><HR>"
|
||||
|
||||
switch(karma_tab)
|
||||
if(0) // Job Unlocks
|
||||
if(!("Barber" in unlocked_jobs))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy=1'>Unlock Barber -- 5KP</a><br>"
|
||||
else
|
||||
dat += "Barber - <font color='green'>Unlocked</font><br>"
|
||||
if(!("Brig Physician" in unlocked_jobs))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy=2'>Unlock Brig Physician -- 5KP</a><br>"
|
||||
else
|
||||
dat += "Brig Physician - <font color='green'>Unlocked</font><br>"
|
||||
if(!("Nanotrasen Representative" in unlocked_jobs))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy=3'>Unlock Nanotrasen Representative -- 30KP</a><br>"
|
||||
else
|
||||
dat += "Nanotrasen Representative - <font color='green'>Unlocked</font><br>"
|
||||
if(!("Blueshield" in unlocked_jobs))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy=4'>Unlock Blueshield -- 30KP</a><br>"
|
||||
else
|
||||
dat += "Blueshield - <font color='green'>Unlocked</font><br>"
|
||||
|
||||
if(1) // Species Unlocks
|
||||
if(!("Machine" in unlocked_species))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=1'>Unlock Machine People -- 15KP</a><br>"
|
||||
else
|
||||
dat += "Machine People - <font color='green'>Unlocked</font><br>"
|
||||
if(!("Kidan" in unlocked_species))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=2'>Unlock Kidan -- 30KP</a><br>"
|
||||
else
|
||||
dat += "Kidan - <font color='green'>Unlocked</font><br>"
|
||||
if(!("Grey" in unlocked_species))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=3'>Unlock Grey -- 30KP</a><br>"
|
||||
else
|
||||
dat += "Grey - <font color='green'>Unlocked</font><br>"
|
||||
if(!("Drask" in unlocked_species))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=7'>Unlock Drask -- 30KP</a><br>"
|
||||
else
|
||||
dat += "Drask - <font color='green'>Unlocked</font><br>"
|
||||
if(!("Vox" in unlocked_species))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=4'>Unlock Vox -- 45KP</a><br>"
|
||||
else
|
||||
dat += "Vox - <font color='green'>Unlocked</font><br>"
|
||||
if(!("Slime People" in unlocked_species))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=5'>Unlock Slime People -- 45KP</a><br>"
|
||||
else
|
||||
dat += "Slime People - <font color='green'>Unlocked</font><br>"
|
||||
if(!("Plasmaman" in unlocked_species))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=6'>Unlock Plasmaman -- 45KP</a><br>"
|
||||
else
|
||||
dat += "Plasmaman - <font color='green'>Unlocked</font><br>"
|
||||
|
||||
if(2) // Karma Refunds
|
||||
var/list/refundable = list()
|
||||
// Get both
|
||||
var/list/purchased = unlocked_jobs + unlocked_species
|
||||
if("Tajaran Ambassador" in purchased)
|
||||
refundable += "Tajaran Ambassador"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Tajaran Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Tajaran Ambassador -- 30KP</a><br>"
|
||||
if("Unathi Ambassador" in purchased)
|
||||
refundable += "Unathi Ambassador"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Unathi Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Unathi Ambassador -- 30KP</a><br>"
|
||||
if("Skrell Ambassador" in purchased)
|
||||
refundable += "Skrell Ambassador"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Skrell Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Skrell Ambassador -- 30KP</a><br>"
|
||||
if("Diona Ambassador" in purchased)
|
||||
refundable += "Diona Ambassador"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Diona Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Diona Ambassador -- 30KP</a><br>"
|
||||
if("Kidan Ambassador" in purchased)
|
||||
refundable += "Kidan Ambassador"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Kidan Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Kidan Ambassador -- 30KP</a><br>"
|
||||
if("Slime People Ambassador" in purchased)
|
||||
refundable += "Slime People Ambassador"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Slime People Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Slime People Ambassador -- 30KP</a><br>"
|
||||
if("Grey Ambassador" in purchased)
|
||||
refundable += "Grey Ambassador"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Grey Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Grey Ambassador -- 30KP</a><br>"
|
||||
if("Vox Ambassador" in purchased)
|
||||
refundable += "Vox Ambassador"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Vox Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Vox Ambassador -- 30KP</a><br>"
|
||||
if("Customs Officer" in purchased)
|
||||
refundable += "Customs Officer"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Customs Officer;KarmaRefundType=job;KarmaRefundCost=30'>Refund Customs Officer -- 30KP</a><br>"
|
||||
if("Nanotrasen Recruiter" in purchased)
|
||||
refundable += "Nanotrasen Recruiter"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Nanotrasen Recruiter;KarmaRefundType=job;KarmaRefundCost=10'>Refund Nanotrasen Recruiter -- 10KP</a><br>"
|
||||
if("Mechanic" in purchased)
|
||||
refundable += "Mechanic"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Mechanic;KarmaRefundType=job;KarmaRefundCost=30'>Refund Mechanic -- 30KP</a><br>"
|
||||
if("Security Pod Pilot" in purchased)
|
||||
refundable += "Security Pod Pilot"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Security Pod Pilot;KarmaRefundType=job;KarmaRefundCost=30'>Refund Security Pod Pilot -- 30KP</a><br>"
|
||||
if("Magistrate" in purchased)
|
||||
refundable += "Magistrate"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Magistrate;KarmaRefundType=job;KarmaRefundCost=45'>Refund Magistrate -- 45KP</a><br>"
|
||||
|
||||
if(!length(refundable))
|
||||
dat += "You do not have any refundable karma purchases.<br>"
|
||||
|
||||
dat += "<br><b>Please note that people who attempt to game the karma system will be banned from the system and have all their unlocks revoked. \"Gaming\" the system includes, but is not limited to:<ul><li>- Karma trading</li><li>- OOC Karma begging</li><li>- Code exploits</li></ul></b>"
|
||||
dat += "</center></body></html>"
|
||||
|
||||
var/datum/browser/popup = new(usr, "karmashop", "<div align='center'>Karma Shop</div>", 400, 500)
|
||||
popup.set_content(dat)
|
||||
popup.open(FALSE)
|
||||
|
||||
// Reloads the values from the DB to ensure they havnt been gamed
|
||||
/datum/karma_holder/proc/sync_karma(mob/M = usr)
|
||||
var/datum/db_query/select_query = SSdbcore.NewQuery("SELECT karma, karmaspent FROM karmatotals WHERE byondkey=:ckey", list(
|
||||
"ckey" = M.ckey
|
||||
))
|
||||
|
||||
if(!select_query.warn_execute())
|
||||
qdel(select_query)
|
||||
return
|
||||
|
||||
while(select_query.NextRow())
|
||||
karma_earned = select_query.item[1]
|
||||
karma_spent = select_query.item[2]
|
||||
|
||||
qdel(select_query)
|
||||
|
||||
|
||||
//Checks if can afford, what you're purchasing, then purchases. (used in client_procs.dm)
|
||||
/datum/karma_holder/proc/karma_purchase(price = 0, category, name, DBname = null)
|
||||
sync_karma() // Ensure its up to date
|
||||
var/karma_available = karma_earned - karma_spent
|
||||
if(karma_available < price)
|
||||
to_chat(usr, "You do not have enough karma!")
|
||||
return
|
||||
if(alert("Are you sure you want to unlock [name]?", "Confirmation", "No", "Yes") != "Yes")
|
||||
return
|
||||
if(karma_available < price) // This is repeated for a reason. Someone could queue up 10 windows to buy things.
|
||||
to_chat(usr, "You do not have enough karma!")
|
||||
return
|
||||
if(!isnull(DBname)) //In case database uses another name for logging. (Machine, Machine People)
|
||||
name = DBname
|
||||
switch(category)
|
||||
if("job")
|
||||
DB_job_unlock(name, price)
|
||||
if("species")
|
||||
DB_species_unlock(name, price)
|
||||
else
|
||||
message_admins("Invalid category used in karma shop by [key_name_admin(usr)] | Possible href exploit.")
|
||||
|
||||
open_shop_menu()
|
||||
|
||||
|
||||
/datum/karma_holder/proc/DB_job_unlock(job, cost)
|
||||
var/datum/db_query/select_query = SSdbcore.NewQuery("SELECT ckey, job FROM whitelist WHERE ckey=:ckey", list(
|
||||
"ckey" = usr.ckey
|
||||
))
|
||||
if(!select_query.warn_execute())
|
||||
qdel(select_query)
|
||||
return
|
||||
|
||||
var/dbjob
|
||||
var/dbckey
|
||||
while(select_query.NextRow())
|
||||
dbckey = select_query.item[1]
|
||||
dbjob = select_query.item[2]
|
||||
|
||||
qdel(select_query)
|
||||
|
||||
// They exist already
|
||||
if(dbckey)
|
||||
var/list/joblist = splittext(dbjob,",")
|
||||
if(!(job in joblist))
|
||||
joblist += job
|
||||
var/newjoblist = jointext(joblist,",")
|
||||
var/datum/db_query/update_query = SSdbcore.NewQuery("UPDATE whitelist SET job=:newjoblist WHERE ckey=:ckey", list(
|
||||
"newjoblist" = newjoblist,
|
||||
"ckey" = usr.ckey
|
||||
))
|
||||
if(!update_query.warn_execute())
|
||||
qdel(update_query)
|
||||
return
|
||||
|
||||
to_chat(usr, "You have unlocked [job].")
|
||||
log_karma("[key_name(usr)] has unlocked [job].")
|
||||
qdel(update_query)
|
||||
karmacharge(cost)
|
||||
usr.client.karmaholder.unlocked_jobs += job
|
||||
else
|
||||
to_chat(usr, "You already have this job unlocked!")
|
||||
|
||||
// They dont exist. Insert them
|
||||
else
|
||||
var/datum/db_query/insert_query = SSdbcore.NewQuery("INSERT INTO whitelist (ckey, job) VALUES (:ckey, :job)", list(
|
||||
"ckey" = usr.ckey,
|
||||
"job" = job
|
||||
))
|
||||
if(!insert_query.warn_execute())
|
||||
qdel(insert_query)
|
||||
return
|
||||
|
||||
to_chat(usr, "You have unlocked [job].")
|
||||
log_karma("[key_name(usr)] has unlocked [job].")
|
||||
karmacharge(cost)
|
||||
|
||||
qdel(insert_query)
|
||||
|
||||
/datum/karma_holder/proc/DB_species_unlock(species, cost)
|
||||
var/datum/db_query/select_query = SSdbcore.NewQuery("SELECT ckey, species FROM whitelist WHERE ckey=:ckey", list(
|
||||
"ckey" = usr.ckey
|
||||
))
|
||||
if(!select_query.warn_execute())
|
||||
qdel(select_query)
|
||||
return
|
||||
|
||||
var/dbspecies
|
||||
var/dbckey
|
||||
|
||||
while(select_query.NextRow())
|
||||
dbckey = select_query.item[1]
|
||||
dbspecies = select_query.item[2]
|
||||
|
||||
qdel(select_query)
|
||||
|
||||
// They exist
|
||||
if(dbckey)
|
||||
var/list/specieslist = splittext(dbspecies,",")
|
||||
if(!(species in specieslist))
|
||||
specieslist += species
|
||||
var/newspecieslist = jointext(specieslist,",")
|
||||
var/datum/db_query/update_query = SSdbcore.NewQuery("UPDATE whitelist SET species=:newspecieslist WHERE ckey=:ckey", list(
|
||||
"newspecieslist" = newspecieslist,
|
||||
"ckey" = usr.ckey
|
||||
))
|
||||
if(!update_query.warn_execute())
|
||||
qdel(update_query)
|
||||
return
|
||||
|
||||
to_chat(usr, "You have unlocked [species].")
|
||||
log_karma("[key_name(usr)] has unlocked [species].")
|
||||
qdel(update_query)
|
||||
karmacharge(cost)
|
||||
usr.client.karmaholder.unlocked_species += species
|
||||
else
|
||||
to_chat(usr, "You already have this species unlocked!")
|
||||
|
||||
// They dont. New row.
|
||||
else
|
||||
var/datum/db_query/insert_query = SSdbcore.NewQuery("INSERT INTO whitelist (ckey, species) VALUES (:ckey, :species)", list(
|
||||
"ckey" = usr.ckey,
|
||||
"species" = species
|
||||
))
|
||||
if(!insert_query.warn_execute())
|
||||
qdel(insert_query)
|
||||
return
|
||||
|
||||
to_chat(usr, "You have unlocked [species].")
|
||||
log_karma("[key_name(usr)] has unlocked [species].")
|
||||
qdel(insert_query)
|
||||
karmacharge(cost)
|
||||
|
||||
|
||||
/datum/karma_holder/proc/karmacharge(cost, refund = FALSE)
|
||||
sync_karma() // Ensure its up to date
|
||||
if(refund)
|
||||
karma_spent -= cost
|
||||
else
|
||||
karma_spent += cost
|
||||
var/datum/db_query/update_query = SSdbcore.NewQuery("UPDATE karmatotals SET karmaspent=:spent WHERE byondkey=:ckey", list(
|
||||
"spent" = karma_spent,
|
||||
"ckey" = usr.ckey
|
||||
))
|
||||
if(!update_query.warn_execute())
|
||||
qdel(update_query)
|
||||
return
|
||||
|
||||
to_chat(usr, "You have been [refund ? "refunded" : "charged"] [cost] karma.")
|
||||
log_karma("[key_name(usr)] has been [refund ? "refunded" : "charged"] [cost] karma.")
|
||||
qdel(update_query)
|
||||
|
||||
/datum/karma_holder/proc/karmarefund(type, name, cost)
|
||||
switch(name)
|
||||
if("Tajaran Ambassador","Unathi Ambassador","Skrell Ambassador","Diona Ambassador","Kidan Ambassador",
|
||||
"Slime People Ambassador","Grey Ambassador","Vox Ambassador","Customs Officer", "Mechanic", "Security Pod Pilot")
|
||||
cost = 30
|
||||
if("Nanotrasen Recruiter")
|
||||
cost = 10
|
||||
if("Magistrate")
|
||||
cost = 45
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>That job is not refundable.</span>")
|
||||
return
|
||||
|
||||
var/datum/db_query/query = SSdbcore.NewQuery("SELECT ckey, job, species FROM whitelist WHERE ckey=:ckey", list(
|
||||
"ckey" = usr.ckey
|
||||
))
|
||||
if(!query.warn_execute())
|
||||
qdel(query)
|
||||
return
|
||||
|
||||
var/dbjob
|
||||
var/dbspecies
|
||||
var/dbckey
|
||||
while(query.NextRow())
|
||||
dbckey = query.item[1]
|
||||
dbjob = query.item[2]
|
||||
dbspecies = query.item[3]
|
||||
|
||||
qdel(query)
|
||||
|
||||
if(dbckey)
|
||||
var/list/typelist = list()
|
||||
var/statement
|
||||
switch(type)
|
||||
if("job")
|
||||
typelist = splittext(dbjob,",")
|
||||
statement = "UPDATE whitelist SET job=:newtypelist WHERE ckey=:ckey"
|
||||
if("species")
|
||||
typelist = splittext(dbspecies,",")
|
||||
statement = "UPDATE whitelist SET species=:newtypelist WHERE ckey=:ckey"
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Type [type] is not a valid column.</span>")
|
||||
|
||||
if(name in typelist)
|
||||
typelist -= name
|
||||
var/newtypelist = jointext(typelist,",")
|
||||
var/datum/db_query/update_query = SSdbcore.NewQuery(statement, list(
|
||||
"ckey" = usr.ckey,
|
||||
"newtypelist" = newtypelist
|
||||
))
|
||||
if(!update_query.warn_execute())
|
||||
qdel(update_query)
|
||||
return
|
||||
else
|
||||
to_chat(usr, "You have been refunded [cost] karma for [type] [name].")
|
||||
log_karma("[key_name(usr)] has been refunded [cost] karma for [type] [name].")
|
||||
switch(type)
|
||||
if("job")
|
||||
usr.client.karmaholder.unlocked_jobs -= name
|
||||
if("species")
|
||||
usr.client.karmaholder.unlocked_species -= name
|
||||
qdel(update_query)
|
||||
karmacharge(text2num(cost), TRUE)
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>You have not bought [name].</span>")
|
||||
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Your ckey ([dbckey]) was not found.</span>")
|
||||
|
||||
/datum/karma_holder/Topic(href, href_list)
|
||||
..()
|
||||
if(href_list["karmashop"])
|
||||
if(!GLOB.configuration.general.enable_karma)
|
||||
to_chat(src, "Karma is disabled on this server.")
|
||||
return
|
||||
|
||||
switch(href_list["karmashop"])
|
||||
if("tab")
|
||||
karma_tab = text2num(href_list["tab"])
|
||||
open_shop_menu()
|
||||
return
|
||||
if("shop")
|
||||
if(href_list["KarmaBuy"])
|
||||
switch(href_list["KarmaBuy"])
|
||||
if("1")
|
||||
karma_purchase(5, "job", "Barber")
|
||||
if("2")
|
||||
karma_purchase(5, "job", "Brig Physician")
|
||||
if("3")
|
||||
karma_purchase(30, "job", "Nanotrasen Representative")
|
||||
if("4")
|
||||
karma_purchase(30, "job", "Blueshield")
|
||||
return
|
||||
if(href_list["KarmaBuy2"])
|
||||
switch(href_list["KarmaBuy2"])
|
||||
if("1")
|
||||
karma_purchase(15, "species", "Machine People", "Machine")
|
||||
if("2")
|
||||
karma_purchase(30, "species", "Kidan")
|
||||
if("3")
|
||||
karma_purchase(30, "species", "Grey")
|
||||
if("4")
|
||||
karma_purchase(45, "species", "Vox")
|
||||
if("5")
|
||||
karma_purchase(45, "species", "Slime People")
|
||||
if("6")
|
||||
karma_purchase(45, "species", "Plasmaman")
|
||||
if("7")
|
||||
karma_purchase(30, "species", "Drask")
|
||||
return
|
||||
if(href_list["KarmaRefund"])
|
||||
var/type = href_list["KarmaRefundType"]
|
||||
var/job = href_list["KarmaRefund"]
|
||||
var/cost = href_list["KarmaRefundCost"]
|
||||
karmarefund(type, job, cost)
|
||||
open_shop_menu()
|
||||
return
|
||||
@@ -350,7 +350,7 @@
|
||||
continue
|
||||
if(blacklist.len && (current_species_name in blacklist))
|
||||
continue
|
||||
if((IS_WHITELISTED in current_species.species_traits) && !is_alien_whitelisted(src, current_species_name))
|
||||
if((IS_WHITELISTED in current_species.species_traits) && !can_use_species(src, current_species_name))
|
||||
continue
|
||||
|
||||
valid_species += current_species_name
|
||||
|
||||
@@ -214,7 +214,7 @@
|
||||
return
|
||||
if(client.prefs.active_character.species in GLOB.whitelisted_species)
|
||||
|
||||
if(!is_alien_whitelisted(src, client.prefs.active_character.species))
|
||||
if(!can_use_species(src, client.prefs.active_character.species))
|
||||
to_chat(src, alert("You are currently not whitelisted to play [client.prefs.active_character.species]."))
|
||||
return FALSE
|
||||
|
||||
@@ -233,7 +233,7 @@
|
||||
client.prefs.load_random_character_slot(client)
|
||||
|
||||
if(client.prefs.active_character.species in GLOB.whitelisted_species)
|
||||
if(!is_alien_whitelisted(src, client.prefs.active_character.species))
|
||||
if(!can_use_species(src, client.prefs.active_character.species))
|
||||
to_chat(src, alert("You are currently not whitelisted to play [client.prefs.active_character.species]."))
|
||||
return FALSE
|
||||
|
||||
@@ -603,7 +603,7 @@
|
||||
|
||||
/mob/new_player/proc/is_species_whitelisted(datum/species/S)
|
||||
if(!S) return 1
|
||||
return is_alien_whitelisted(src, S.name) || !(IS_WHITELISTED in S.species_traits)
|
||||
return can_use_species(src, S.name) || !(IS_WHITELISTED in S.species_traits)
|
||||
|
||||
/mob/new_player/get_gender()
|
||||
if(!client || !client.prefs) ..()
|
||||
|
||||
@@ -274,7 +274,7 @@
|
||||
timer = world.time
|
||||
GLOB.priority_announcement.Announce("The Emergency Shuttle has left the station. Estimate [timeLeft(600)] minutes until the shuttle docks at Central Command.")
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
if(!isnewplayer(M) && !M.client.karma_spent && !(M.client.ckey in GLOB.karma_spenders) && !M.get_preference(PREFTOGGLE_DISABLE_KARMA_REMINDER))
|
||||
if(!isnewplayer(M) && !(M.client.ckey in GLOB.karma_spenders) && !M.get_preference(PREFTOGGLE_DISABLE_KARMA_REMINDER))
|
||||
to_chat(M, "<i>You have not yet spent your karma for the round; was there a player worthy of receiving your reward? Look under Special Verbs tab, Award Karma.</i>")
|
||||
|
||||
if(SHUTTLE_ESCAPE)
|
||||
|
||||
@@ -1396,6 +1396,8 @@
|
||||
#include "code\modules\client\login_processing\38-alts_cid.dm"
|
||||
#include "code\modules\client\login_processing\39-cid_count.dm"
|
||||
#include "code\modules\client\login_processing\40-pai_save.dm"
|
||||
#include "code\modules\client\login_processing\42-karma_numbers.dm"
|
||||
#include "code\modules\client\login_processing\43-karma_unlocks.dm"
|
||||
#include "code\modules\client\login_processing\45-cuis.dm"
|
||||
#include "code\modules\client\login_processing\__client_login_processor.dm"
|
||||
#include "code\modules\client\preference\character.dm"
|
||||
@@ -1694,6 +1696,7 @@
|
||||
#include "code\modules\instruments\songs\play_legacy.dm"
|
||||
#include "code\modules\instruments\songs\play_synthesized.dm"
|
||||
#include "code\modules\karma\karma.dm"
|
||||
#include "code\modules\karma\karma_holder.dm"
|
||||
#include "code\modules\keybindings\bindings_admin.dm"
|
||||
#include "code\modules\keybindings\bindings_ai.dm"
|
||||
#include "code\modules\keybindings\bindings_atom.dm"
|
||||
|
||||
Reference in New Issue
Block a user