Files
Bubberstation/code/modules/mining/abandoned_crates.dm
SkyratBot bf8f344f79 [MIRROR] Moves loot var to the abandoned crate itself, qdel_on_open now actually qdels on open instead of unlock [MDB IGNORE] (#17972)
* Moves loot var to the abandoned crate itself, qdel_on_open now actually qdels on open instead of unlock (#71723)

## About The Pull Request

This stupid var is should have been called "qdel_on_unlock". Now it
actually triggers on open, and qdels AFTER all of the contents in the
crate are gone. This prevents it from deleting its contents before it
can dump them, which I'm assuming it has been doing since the dawn of
time.

## Why It's Good For The Game

Closes #71718

Makes it so admins can set the loot for abandoned crates or peek into
their contents, for whatever reason they may have. Also allows coders to
choose which loot to recieve in the event that a bug like this needs
debugging (again).
## Changelog
🆑 Rhials
fix: Earning the Mimic loot drop from an abandoned crate now properly
spawns the mimic.
/🆑

* Moves loot var to the abandoned crate itself, qdel_on_open now actually qdels on open instead of unlock

Co-authored-by: Rhials <Datguy33456@gmail.com>
2022-12-08 07:49:11 -08:00

249 lines
8.3 KiB
Plaintext

//Originally coded by ISaidNo, later modified by Kelenius. Ported from Baystation12.
/obj/structure/closet/crate/secure/loot
name = "abandoned crate"
desc = "What could be inside?"
icon_state = "securecrate"
integrity_failure = 0 //no breaking open the crate
var/code = null
var/lastattempt = null
var/attempts = 10
var/codelen = 4
var/qdel_on_open = FALSE
var/spawned_loot = FALSE
tamperproof = 90
// Stop people from "diving into" the crate accidentally, and then detonating it.
divable = FALSE
/obj/structure/closet/crate/secure/loot/Initialize(mapload)
. = ..()
var/list/digits = list("1", "2", "3", "4", "5", "6", "7", "8", "9", "0")
code = ""
for(var/i in 1 to codelen)
var/dig = pick(digits)
code += dig
digits -= dig //there are never matching digits in the answer
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/structure/closet/crate/secure/loot/attack_hand(mob/user, list/modifiers)
if(locked)
to_chat(user, span_notice("The crate is locked with a Deca-code lock."))
var/input = input(usr, "Enter [codelen] digits. All digits must be unique.", "Deca-Code Lock", "") as text|null
if(user.canUseTopic(src, be_close = TRUE) && locked)
var/list/sanitised = list()
var/sanitycheck = TRUE
var/char = ""
var/length_input = length(input)
for(var/i = 1, i <= length_input, i += length(char)) //put the guess into a list
char = input[i]
sanitised += text2num(char)
for(var/i in 1 to length(sanitised) - 1) //compare each digit in the guess to all those following it
for(var/j in i + 1 to length(sanitised))
if(sanitised[i] == sanitised[j])
sanitycheck = FALSE //if a digit is repeated, reject the input
if(input == code)
if(!spawned_loot)
spawn_loot()
tamperproof = 0 // set explosion chance to zero, so we dont accidently hit it with a multitool and instantly die
togglelock(user)
else if(!input || !sanitycheck || length(sanitised) != codelen)
to_chat(user, span_notice("You leave the crate alone."))
else
to_chat(user, span_warning("A red light flashes."))
lastattempt = input
attempts--
if(attempts == 0)
boom(user)
return
return ..()
/obj/structure/closet/crate/secure/loot/AltClick(mob/living/user)
if(!user.canUseTopic(src, be_close = TRUE))
return
return attack_hand(user) //this helps you not blow up so easily by overriding unlocking which results in an immediate boom.
/obj/structure/closet/crate/secure/loot/attackby(obj/item/W, mob/user)
if(locked)
if(W.tool_behaviour == TOOL_MULTITOOL)
to_chat(user, span_notice("DECA-CODE LOCK REPORT:"))
if(attempts == 1)
to_chat(user, span_warning("* Anti-Tamper Bomb will activate on next failed access attempt."))
else
to_chat(user, span_notice("* Anti-Tamper Bomb will activate after [attempts] failed access attempts."))
if(lastattempt != null)
var/bulls = 0 //right position, right number
var/cows = 0 //wrong position but in the puzzle
var/lastattempt_char = ""
var/length_lastattempt = length(lastattempt)
var/lastattempt_it = 1
var/code_char = ""
var/length_code = length(code)
var/code_it = 1
while(lastattempt_it <= length_lastattempt && code_it <= length_code) // Go through list and count matches
lastattempt_char = lastattempt[lastattempt_it]
code_char = code[code_it]
if(lastattempt_char == code_char)
++bulls
else if(findtext(code, lastattempt_char))
++cows
lastattempt_it += length(lastattempt_char)
code_it += length(code_char)
to_chat(user, span_notice("Last code attempt, [lastattempt], had [bulls] correct digits at correct positions and [cows] correct digits at incorrect positions."))
return
return ..()
/obj/structure/closet/crate/secure/loot/emag_act(mob/user)
if(locked)
boom(user)
return
return ..()
/obj/structure/closet/crate/secure/loot/togglelock(mob/user, silent = FALSE)
if(!locked)
. = ..() //Run the normal code.
if(locked) //Double check if the crate actually locked itself when the normal code ran.
//reset the anti-tampering, number of attempts and last attempt when the lock is re-enabled.
tamperproof = initial(tamperproof)
attempts = initial(attempts)
lastattempt = null
return
if(tamperproof)
return
return ..()
/obj/structure/closet/crate/secure/loot/deconstruct(disassembled = TRUE)
if(locked)
boom()
return
return ..()
/obj/structure/closet/crate/secure/loot/open(mob/living/user, force = FALSE)
. = ..()
if(qdel_on_open)
qdel(src)
/obj/structure/closet/crate/secure/loot/proc/spawn_loot()
var/loot = rand(1,100) //100 different crates with varying chances of spawning
switch(loot)
if(1 to 5) //5% chance
new /obj/item/reagent_containers/cup/glass/bottle/rum(src)
new /obj/item/reagent_containers/cup/glass/bottle/whiskey(src)
new /obj/item/reagent_containers/cup/glass/bottle/whiskey(src)
new /obj/item/lighter(src)
new /obj/item/reagent_containers/cup/glass/bottle/absinthe/premium(src)
for(var/i in 1 to 3)
new /obj/item/clothing/mask/cigarette/rollie(src)
if(6 to 10)
new /obj/item/melee/skateboard/pro(src)
if(11 to 15)
new /mob/living/simple_animal/bot/secbot/honkbot(src)
if(16 to 20)
new /obj/item/stack/ore/diamond(src, 10)
if(21 to 25)
for(var/i in 1 to 5)
new /obj/item/poster/random_contraband(src)
if(26 to 30)
new /obj/item/vending_refill/sovietsoda(src)
var/obj/item/circuitboard/machine/vendor/board = new (src)
board.set_type(/obj/machinery/vending/sovietsoda)
if(31 to 35)
new /obj/item/seeds/firelemon(src)
if(36 to 40)
for(var/i in 1 to 5)
new /obj/item/toy/snappop/phoenix(src)
if(41 to 45)
new /obj/item/modular_computer/pda/clear(src)
if(46 to 50)
new /obj/item/storage/box/syndie_kit/chameleon/broken
if(51 to 52) // 2% chance
new /obj/item/melee/baton(src)
if(53 to 54)
new /obj/item/toy/balloon/corgi(src)
if(55 to 56)
var/newitem = pick(subtypesof(/obj/item/toy/mecha))
new newitem(src)
if(57 to 58)
new /obj/item/toy/balloon/syndicate(src)
if(59 to 60)
new /obj/item/borg/upgrade/modkit/aoe/mobs(src)
new /obj/item/clothing/suit/space(src)
new /obj/item/clothing/head/helmet/space(src)
if(61 to 62)
for(var/i in 1 to 5)
new /obj/item/clothing/head/costume/kitty(src)
new /obj/item/clothing/neck/petcollar(src)
if(63 to 64)
new /obj/item/clothing/shoes/kindle_kicks(src)
if(65 to 66)
new /obj/item/clothing/suit/costume/ianshirt(src)
new /obj/item/clothing/suit/hooded/ian_costume(src)
if(67 to 68)
new /obj/item/toy/plush/awakenedplushie(src)
if(69 to 70)
new /obj/item/stack/ore/bluespace_crystal(src, 5)
if(71 to 72)
new /obj/item/toy/plush/snakeplushie(src)
if(73 to 74)
new /mob/living/simple_animal/pet/gondola(src)
if(75 to 76)
new /obj/item/bikehorn/airhorn(src)
if(77 to 78)
new /obj/item/toy/plush/lizard_plushie(src)
if(79 to 80)
new /obj/item/stack/sheet/mineral/bananium(src, 10)
if(81 to 82)
new /obj/item/bikehorn/airhorn(src)
if(83 to 84)
new /obj/item/toy/plush/beeplushie(src)
if(85 to 86)
new /obj/item/defibrillator/compact(src)
if(87) //1% chance
new /obj/item/weed_extract(src)
if(88)
new /obj/item/reagent_containers/cup/glass/bottle/lizardwine(src)
if(89)
new /obj/item/melee/energy/sword/bananium(src)
if(90)
new /obj/item/dnainjector/wackymut(src)
if(91)
for(var/i in 1 to 30)
new /mob/living/basic/cockroach(src)
if(92)
new /obj/item/katana(src)
if(93)
new /obj/item/dnainjector/xraymut(src)
if(94)
new /mob/living/simple_animal/hostile/mimic/crate(src)
qdel_on_open = TRUE
if(95)
new /obj/item/toy/plush/nukeplushie(src)
if(96)
new /obj/item/banhammer(src)
for(var/i in 1 to 3)
var/obj/effect/mine/sound/bwoink/mine = new (src)
mine.set_anchored(FALSE)
mine.move_resist = MOVE_RESIST_DEFAULT
if(97)
for(var/i in 1 to 4)
new /obj/item/clothing/mask/balaclava(src)
new /obj/item/gun/ballistic/shotgun/toy(src)
new /obj/item/gun/ballistic/automatic/pistol/toy(src)
new /obj/item/gun/ballistic/automatic/toy/unrestricted(src)
new /obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted(src)
new /obj/item/ammo_box/foambox(src)
if(98)
for(var/i in 1 to 3)
new /mob/living/simple_animal/hostile/bee/toxin(src)
if(99)
new /obj/item/implanter/sad_trombone(src)
if(100)
new /obj/item/melee/skateboard/hoverboard(src)
spawned_loot = TRUE