diff --git a/__DEFINES/global.dm b/__DEFINES/global.dm index eaef18824be..bbd93a7b554 100644 --- a/__DEFINES/global.dm +++ b/__DEFINES/global.dm @@ -403,7 +403,8 @@ var/list/boss_mobs = list( /mob/living/simple_animal/hostile/humanoid/surgeon/skeleton, // Second stage of Doctor Placeholder /mob/living/simple_animal/hostile/roboduck, // The bringer of the end times /mob/living/simple_animal/hostile/bear/spare, // Captain bear - /mob/living/simple_animal/hostile/ginger/gingerbroodmother // Gingerbominations... + /mob/living/simple_animal/hostile/ginger/gingerbroodmother, // Gingerbominations... + /mob/living/simple_animal/hostile/old_vendotron, // Why is a normal, harmless, vending machine on this list? ) // Set by traitor item, affects cargo supplies diff --git a/code/datums/helper_datums/command_alerts.dm b/code/datums/helper_datums/command_alerts.dm index 785eec23586..db9b35edaa6 100644 --- a/code/datums/helper_datums/command_alerts.dm +++ b/code/datums/helper_datums/command_alerts.dm @@ -740,3 +740,14 @@ The access requirements on the Asteroid Shuttles' consoles have now been revoked name = "Ancient Cryogenic Pod" alert_title = "Abnormal Life Sign Report" message = "An abnormal life sign has been detected in promiximity of the station. Long range scans determine signal to be human life. Approach with caution." + +/datum/command_alert/old_vendotron_crash + alert_title = "Odd Machine Debris" + message = "A large chunk of debris is on a collision course with your station. Moderate damage is expected at its current velocity. The nature of the debris is unknown, however our sensors are picking up what sounds like the faint jingling of coins." + +/datum/command_alert/old_vendotron_teleport + alert_title = "Warning - Unknown Bluespace Anom#ly Det%ct!$" + +/datum/command_alert/old_vendotron_teleport/announce() + message = "A bluespace tear of unknown origin is formi!g w£thi$ !$@ cu&ic met£#s o£ [station_name()] plea$e-BZZZZZZZT Come on down for fabulous, splendiferous, one of a kind goods at reasona#le pri$es! We'%e prac@ic£all% giving #$e@ away! All $ales a#$ fi@%l-BZZZT excercise caution and report any anomalous activity." + ..() diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 26f09863e08..ecdcc48dbd3 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -836,6 +836,8 @@ var/global/floorIsLava = 0 Spawn an Immovable Monolith (highly destructive!)
Trigger an Organic Debris Field
Send some fireworks at the station
+ Launch an old vendotron at the station
+ Teleport an old vendotron onto the station

Spawn a blob cluster
Trigger an Alien infestation
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 2e802f7fbf1..fff5cd1ed58 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -3533,6 +3533,16 @@ feedback_add_details("admin_secrets_fun_used","IRH") message_admins("[key_name_admin(usr)] has sent an immovable monolith to the station. That one's gonna hurt.", 1) immovablerod(2) + if("old_vendotron_crash") + feedback_inc("admin_secrets_fun_used", 1) + feedback_add_details("admin_secrets_fun_used","VENDC") + message_admins("[key_name_admin(usr)] has started an old vendotron crash event", 1) + new /datum/event/old_vendotron_crash + if("old_vendotron_teleport") + feedback_inc("admin_secrets_fun_used", 1) + feedback_add_details("admin_secrets_fun_used","VENDT") + message_admins("[key_name_admin(usr)] has started an old vendotron teleport event", 1) + new /datum/event/old_vendotron_teleport if("prison_break") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","PB") diff --git a/code/modules/events/old_vendotron_event/old_vendotron.dm b/code/modules/events/old_vendotron_event/old_vendotron.dm new file mode 100644 index 00000000000..b5e4ca50876 --- /dev/null +++ b/code/modules/events/old_vendotron_event/old_vendotron.dm @@ -0,0 +1,419 @@ +/obj/machinery/vending/old_vendotron + name = "old vendotron" + desc = "Covered in layers of gunk of varying ages and origins, it's obvious this old vendotron has a history, and wares to match." + icon_state = "Old_Vendotron" + icon_vend = "Old_Vendotron-vend" + unhackable = TRUE + mech_flags = MECH_SCAN_FAIL + var/list/commonStock = list( + /obj/item/pizzabox/meat = 50, + /obj/item/toy/crayon/rainbow = 15, + /obj/item/toy/crayon/mime = 15, + /obj/item/weapon/reagent_containers/food/snacks/egg/parrot = 20, + /mob/living/simple_animal/crab = 40, + /mob/living/simple_animal/corgi/puppy = 25, + /mob/living/simple_animal/hostile/carp/baby = 75, + /obj/item/weapon/storage/box/autoinjectors = 75, + /obj/item/weapon/fossil = 50, + /obj/item/weapon/fossil/egg = 50, + /obj/item/weapon/fossil/plant = 50, + /obj/item/weapon/reagent_containers/glass/beaker/vial/mystery = 50, + /obj/item/clothing/gloves/yellow = 100, + /obj/item/clothing/gloves/black = 150, //Same price as pickpocket gloves so you don't know which you're getting + /obj/item/weapon/reagent_containers/syringe/giant = 50, + /obj/item/weapon/storage/box/donkpockets = 50, + /obj/item/weapon/storage/box/snappops = 50, + /obj/item/weapon/storage/box/actionfigure = 150, + /obj/item/weapon/storage/box/biscuit = 100, + /obj/item/device/camera_bug = 25, + /obj/item/weapon/tank/emergency_oxygen/double = 100, + /obj/item/weapon/storage/wallet = 40, + /obj/item/weapon/storage/fancy/donut_box = 75, + /obj/item/weapon/beach_ball = 50, + /obj/item/weapon/beartrap = 150, + /obj/item/device/wormhole_jaunter = 40, + /obj/item/weapon/soap/ = 25, + /obj/item/clothing/glasses/monocle = 35, + /obj/item/clothing/glasses/sunglasses/purple = 35, + /obj/item/clothing/glasses/sunglasses/star = 35, + /obj/item/clothing/glasses/sunglasses/rockstar = 35, + /obj/item/clothing/glasses/sunglasses/big = 35, + /obj/item/clothing/head/helmet/snail_helm = 50, + /obj/item/clothing/head/cakehat = 50, + /obj/item/clothing/head/pumpkinhead = 50, + /obj/item/clothing/head/tinfoil = 50, + /obj/item/clothing/mask/horsehead = 150, + /obj/item/clothing/shoes/leather = 50, + /obj/item/clothing/shoes/magboots = 75, + /obj/item/weapon/dnainjector/nofail/randompower = 350, + /obj/item/weapon/gun/hookshot = 200, + /obj/item/weapon/gun/siren/supersoaker = 250, + /obj/item/device/mobcapsule = 75, + /obj/item/supermatter_shielding = 350, + /obj/item/weapon/boomerang = 50, + /obj/item/weapon/melee/lance = 250, + /obj/item/weapon/storage/pill_bottle/random = 120, + /obj/item/weapon/reagent_containers/pill/time_release = 120, + /obj/item/weapon/reagent_containers/pill/random/maintenance = 20, //Obviously the expensive one is better, right? + /obj/item/weapon/reagent_containers/pill/random/maintenance = 40, + /obj/item/weapon/reagent_containers/pill/random/maintenance = 60, + /obj/item/weapon/reagent_containers/pill/random/maintenance = 80, + /obj/item/weapon/reagent_containers/pill/random/maintenance = 100, + /obj/item/weapon/bikehorn/rubberducky = 150, + /obj/item/weapon/glue/temp_glue = 100, + /obj/item/weapon/storage/toolbox/syndicate = 150, + /obj/item/weapon/storage/firstaid/adv = 150, + /obj/item/weapon/reagent_containers/food/snacks/donut/chaos = 50, + /obj/item/weapon/stock_parts/micro_laser/high/ultra = 150, + /obj/item/weapon/stock_parts/manipulator/nano/pico = 150, + /obj/item/weapon/stock_parts/scanning_module/adv/phasic = 150, + /obj/item/weapon/stock_parts/capacitor/adv/super = 150, + /obj/item/slime_extract/grey = 100, + /obj/item/slime_extract/silver = 130, + /obj/item/slime_extract/pink = 150, + /obj/item/slime_extract/bluespace = 200, + /obj/item/weapon/pickaxe/drill/diamond = 500, + /obj/item/weapon/reagent_containers/food/snacks/monkeycube/mysterycube = 150, + /obj/item/weapon/storage/box/large/mystery_material = 150, + + ) + + var/list/uncommonStock = list( + /mob/living/simple_animal/rabbit = 250, + /obj/item/potion/healing = 250, + /obj/item/potion/transform = 300, + /obj/item/potion/stoneskin = 250, + /obj/item/potion/random = 150, + /obj/item/potion/invisibility/major = 350, + /obj/item/weapon/dice/d20/cursed = 250, + /obj/item/weapon/implanter/compressed = 400, + /obj/item/weapon/storage/box/syndie_kit/imp_freedom = 500, + /obj/item/weapon/reagent_containers/food/snacks/egg/chaos = 50, + /obj/item/bluespace_crystal = 75, + /mob/living/simple_animal/hostile/gremlin = 125, + /mob/living/simple_animal/hostile/wolf/pliable = 200, + /obj/item/weapon/gun/hookshot/whip = 75, + /obj/item/clothing/head/leather/deer/horned = 200, + /obj/item/weapon/reagent_containers/food/snacks/monkeycube/gourmonger = 65, + /obj/item/weapon/storage/box/monkeycubes/spacecarpcube = 350, + /obj/item/weapon/storage/belt/leather = 175, + /obj/item/clothing/suit/armor/ice = 250, + /obj/item/weapon/butterflyknife/viscerator/bunny = 200, + /obj/item/weapon/reagent_containers/glass/beaker/large/plasma = 100, + /obj/item/clothing/gloves/black/thief = 150, + /obj/item/clothing/gloves/black/thief/storage = 150, + /obj/item/weapon/grenade/chem_grenade/wind = 75, + /obj/item/clothing/suit/armor/reactive = 175, + /obj/item/weapon/storage/box/boxen = 200, + /obj/item/weapon/tank/emergency_oxygen/double/wizard = 250, + /obj/item/weapon/gun/projectile/shotgun/doublebarrel = 150, + /obj/item/weapon/storage/backpack/holding = 250, + /obj/item/weapon/reagent_containers/glass/bottle/frostoil = 75, + /obj/item/clothing/accessory/holomap_chip = 250, + /obj/item/weapon/fireaxe = 150, + /obj/item/clothing/suit/space/rig/syndicate_elite = 150, + /obj/item/clothing/shoes/clown_shoes/advanced = 150, + /obj/item/clothing/back/magiccape = 150, + /obj/item/clothing/glasses/thermal = 250, + /obj/item/clothing/glasses/emitter = 250, + /obj/item/clothing/head/helmet/knight = 200, + /obj/item/clothing/head/helmet/knight/interrogator = 200, + /obj/item/clothing/mask/gas/voice = 300, + /obj/item/clothing/mask/goldface = 200, + /obj/item/clothing/mask/morphing/amorphous = 300, + /obj/item/clothing/mask/morphing = 250, + /obj/item/clothing/under/chameleon = 250, + /obj/item/clothing/under/contortionist = 600, + /obj/item/device/modkit/storm_rig = 500, + /obj/item/device/modkit/fatsec_rig = 450, + /obj/item/soulstone = 150, + /obj/item/weapon/gun/energy/taser/ricochet = 350, + /obj/item/weapon/reagent_containers/food/snacks/meat/wendigo = 400, + /obj/item/weapon/disk/shuttle_coords/vault/random = 200, + /obj/item/weapon/glue = 450, + /obj/item/weapon/shield/energy = 350, + /obj/item/weapon/storage/pill_bottle/creatine = 300, + /obj/item/weapon/bikehorn/baton = 300, + /obj/item/weapon/grenade/flashbang/clusterbang = 300, + /obj/item/cannonball/bananium = 200, + /obj/item/weapon/stock_parts/micro_laser/high/ultra/giga = 200, + /obj/item/weapon/stock_parts/capacitor/adv/super/ultra = 250, + /obj/item/weapon/stock_parts/manipulator/nano/pico/femto = 200, + /obj/item/weapon/stock_parts/scanning_module/adv/phasic/bluespace = 200, + /obj/item/weapon/storage/lockbox/advanced = 150, + /obj/item/device/analyzer/scope = 220, + /obj/item/weapon/circuitboard/mecha/phazon/main = 350, + /obj/item/mecha_parts/mecha_equipment/teleporter = 300, + /obj/item/mecha_parts/mecha_equipment/gravcatapult = 300, + /obj/item/weapon/storage/box/mysterycubes = 250, + /obj/item/weapon/glow_orb = 200, + /obj/item/stack/sheet/mineral/phazon = 300, + ) + + var/list/rareStock = list( + /obj/item/clothing/suit/armor/rune = 1500, + /obj/item/clothing/gloves/powerfist = 1800, //I don't even know if these work! + /obj/item/clothing/head/bearpelt/real/spare = 800, + /obj/item/clothing/head/celtic = 250, + /obj/item/weapon/winter_gift/special = 2400, //Extremely difficult outside of the whole station wanting you to be a vampire + /obj/item/clothing/mask/morphing/amorphous = 150, //Cheaper than uncommon + /obj/item/clothing/shoes/magboots/deathsquad = 500, + /obj/item/clothing/suit/space/rig/centcomm/old = 500, + /obj/item/clothing/suit/space/santa = 800, + /obj/item/clothing/head/helmet/space/santahat = 500, + /obj/item/clothing/suit/storage/draculacoat = 300, + /obj/item/clothing/suit/clownpiece/flying = 500, + /obj/item/clothing/suit/bomber_vest = 600, + /obj/item/clothing/under/chameleon/all = 1200, //Style ain't cheap + /obj/item/gingerbread_egg = 750, + /obj/item/weapon/gun/portalgun = 1100, + /obj/item/weapon/gun/energy/staff/swapper = 1000, + /obj/item/bluespace_crystal/flawless = 2400, //Spessmart has it at 1800 so we're making it pricier + /obj/item/weapon/cloakingcloak = 1400, + /obj/structure/bed/chair/vehicle/wheelchair/multi_people = 900, + /obj/item/weapon/veilrender/vealrender = 50000, //One day, 30 years from now, someone will win the lottery in a round this is rolled + /obj/item/phylactery = 750, + /obj/item/clothing/shoes/blindingspeed = 1800, + ) + +/obj/machinery/vending/old_vendotron/New() + ..() + decideStock() + build_inventories() + +/obj/machinery/vending/old_vendotron/proc/decideStock() + var/stockAmount = rand(6, 18) + var/rarerRolls = 1 + round(player_list.len * 0.1, 1) //More players more stock, slightly + for(var/i = 1 to stockAmount) + if(prob(70)) + addCommonStock() + else + addUncommonStock() + for(var/u = 1 to rarerRolls) //Guaranteed uncommon stock, much more likely rare stock + addUncommonStock() + +/obj/machinery/vending/old_vendotron/proc/addCommonStock() + var/theStock = 0 + theStock = rand(1, commonStock.len) + var/chosenStock = commonStock[theStock] + products.Add(chosenStock) + if(prob(50)) //common items can easily have 2-3 stock + products[chosenStock] = 2 + else if(prob(25)) + products[chosenStock] = 3 + var/stockPrice = priceRandomizer(commonStock[chosenStock]) + prices.Add(chosenStock) + prices[chosenStock] = stockPrice + +/obj/machinery/vending/old_vendotron/proc/addUncommonStock() + if(prob(80)) + var/theStock = 0 + theStock = rand(1, uncommonStock.len) + var/chosenStock = uncommonStock[theStock] + products.Add(chosenStock) + if(prob(15)) //Uncommon items A rare double stock + products[chosenStock] = 2 + var/stockPrice = priceRandomizer(uncommonStock[chosenStock]) + prices.Add(chosenStock) + prices[chosenStock] = stockPrice + else + addRareStock() + +/obj/machinery/vending/old_vendotron/proc/addRareStock() + var/theStock = 0 + theStock = rand(1, rareStock.len) + var/chosenStock = rareStock[theStock] + products.Add(chosenStock) + var/stockPrice = priceRandomizer(rareStock[chosenStock]) + prices.Add(chosenStock) + prices[chosenStock] = stockPrice + +/obj/machinery/vending/old_vendotron/proc/priceRandomizer(var/thePrice = 0) + thePrice = rand(thePrice * 0.7, thePrice * 1.3) //30% cheaper or pricier, totally random for SPICE + return thePrice + + +//Begin spoilers///// + + +/obj/machinery/vending/old_vendotron/emag(mob/user) + if(!emagged) + emagged = TRUE + if(prob(50)) + punishCheapskate() + else + neoUltraCapitalismMode(user) + +/obj/machinery/vending/old_vendotron/emp_act(severity) + if(severity < 3) + punishCheapskate() + +/obj/machinery/vending/old_vendotron/kick_act(mob/living/carbon/human/user) + ..() + if(prob(1)) //Let's make it very hard to turn this against the crew without tools + if(prob(75)) + punishCheapskate() + else + neoUltraCapitalismMode(user) + +/obj/machinery/vending/old_vendotron/malfunction() + punishCheapskate() + +/obj/machinery/vending/old_vendotron/crowbarDestroy(mob/user, obj/item/tool/crowbar/C) + user.visible_message( "[user] struggles to pry out the firmly secured circuitboard from \the [src].", + "You struggle to pry out the firmly secured circuitboard from \the [src]...") + if(do_after(user, src, 10 SECONDS)) //This is a strong hint that something may or may not be going on + user.drop_item(C, get_turf(user), 1) //Your glue won't help + C.animationBolt() + user.visible_message( "\The [src] begins to pry out the circuitboard from [user].", + "\The [src] begins to pry out the circuitboard from you.") + + +/obj/machinery/vending/old_vendotron/proc/punishCheapskate() + var/ourPunishment = rand(1, 6) + switch(ourPunishment) + if(1) + ahhSpiders() //I will not be changing these proc names. + if(2) + platesPlatesPlates() //They are perfect the way they are + if(3) + broadSideBarrage() //I mean it, I'm not changing these + if(4) + youHaveToEatAllTheEggs() //Go on, ask me + if(5) + ghettoNightmare() //I will say "No" + if(6) + neoUltraCapitalismMode() + +/obj/machinery/vending/old_vendotron/proc/ahhSpiders(var/spiderAmount = 20) + visible_message("Loud chittering can be heard from \the [src]!") + for(var/i = 1, i < spiderAmount, i++) + spawn(i+1) + if(prob(75)) + new /mob/living/simple_animal/hostile/giant_spider/spiderling(get_turf(src)) + else + new /mob/living/simple_animal/hostile/giant_spider/hunter(get_turf(src)) + +/obj/machinery/vending/old_vendotron/proc/platesPlatesPlates(var/plateAmount = 50) //This many is necessary, I promise + visible_message("\The [src] enters dinner mode!") + for(var/i = 1, i < plateAmount, i++) + spawn(i+2) + var/obj/item/trash/plate/thePlate = new /obj/item/trash/plate(get_turf(src)) + var/turf/plateTarg = null + if(prob(50)) + var/plateDir = pick(alldirs) + plateTarg = get_edge_target_turf(src, plateDir) + else + var/mob/living/t = locate() in view(7, src) //copy paste of vendor throwing for theming + plateTarg = t + if(plateTarg) + thePlate.throw_at(plateTarg, 10, i) + +/obj/machinery/vending/old_vendotron/proc/broadSideBarrage() + visible_message("\The [src] detects a product piracy attempt!") + for(var/dir in cardinal) + var/turf/T = get_turf(get_step(loc, dir)) + var/obj/structure/siege_cannon/sC = new /obj/structure/siege_cannon(T) + var/obj/item/cannonball/cB = null + if(prob(25)) + cB = new /obj/item/cannonball/bananium(sC) + sC.icon_state = "clownnon" + sC.name = "circus cannon" + sC.beenClowned = TRUE + else + cB = new /obj/item/cannonball/iron(sC) + sC.loadedItem = cB + sC.wFuel = 20 + sC.dir = get_dir(src, sC) + sC.anchored = TRUE + spawn(1 SECONDS) + if(!sC.gcDestroyed) + sC.itemFire() + animate(src, alpha = 0, time = 1 SECONDS) + spawn(2 SECONDS) + if(!sC.gcDestroyed) + qdel(sC) + +/obj/machinery/vending/old_vendotron/proc/youHaveToEatAllTheEggs(var/eggAmount = 8) + visible_message("\The [src] vends some peculiar eggs!") + for(var/i = 1 to eggAmount) + var/turf/eggT = get_turf(pick(orange(5, get_turf(src)))) + var/obj/item/weapon/reagent_containers/food/snacks/egg/cEgg = new /obj/item/weapon/reagent_containers/food/snacks/egg/chaos(eggT) + var/eggTimer = rand(3, 10) + spawn(eggTimer SECONDS) + if(!cEgg.gcDestroyed) + cEgg.hatch() + +/obj/machinery/vending/old_vendotron/proc/ghettoNightmare(var/nightmareLevel = 8, mob/user) //This is a sin + visible_message("Even \the [src] looks afraid!") + var/obj/item/weapon/grenade/iedcasing/preassembled/gNightmare = new /obj/item/weapon/grenade/iedcasing/preassembled(get_turf(src)) + gNightmare.det_time = 5 SECONDS + gNightmare.name = "Improvised Explosive Nightmare" + for(var/i = 1 to nightmareLevel) + var/obj/item/anvil/A = new /obj/item/anvil(gNightmare) + gNightmare.shrapnel_list.Add(A) + gNightmare.current_shrapnel++ + if(gNightmare.current_shrapnel >= gNightmare.max_shrapnel) + break //More of a safety, already breaking the laws of IED + var/turf/gTarg = get_ranged_target_turf(src, dir, 3) + gNightmare.throw_at(gTarg, 3, 5) + gNightmare.attack_self(user) + animate(gNightmare, transform = matrix()*3, time = 5 SECONDS) + +/obj/machinery/vending/old_vendotron/proc/neoUltraCapitalismMode(mob/user) + visible_message("\The [src] engages neo-ultra-capitalism mode!") + do_flick(src, "Old_Vendotron-transform", 25) + var/mob/living/simple_animal/hostile/old_vendotron/madVendor = new /mob/living/simple_animal/hostile/old_vendotron(loc) + madVendor.ourVendor = src + src.forceMove(madVendor) + if(user) + madVendor.GiveTarget(user) + +/mob/living/simple_animal/hostile/old_vendotron + name = "old vendotron" + desc = "Pay up" + icon = 'icons/mob/old_vendotron.dmi' + icon_state = "Old_Vendotron" + icon_living = "Old_Vendotron" + maxHealth = 600 + health = 600 + melee_damage_lower = 10 + melee_damage_upper = 30 + attacktext = "vends" + mob_property_flags = MOB_CONSTRUCT | MOB_ROBOTIC | MOB_NO_PETRIFY | MOB_NO_LAZ + environment_smash_flags = SMASH_CONTAINERS | SMASH_WALLS | OPEN_DOOR_STRONG + var/obj/machinery/vending/old_vendotron/ourVendor = null + var/lastPunish = 0 + var/punishCooldown = 50 + +/mob/living/simple_animal/hostile/old_vendotron/death(var/gibbed = FALSE) + if(ourVendor) + ourVendor.forceMove(loc) + else + explosion(loc, 1,2,2) + ..(gibbed) + qdel(src) + +/mob/living/simple_animal/hostile/old_vendotron/Life() + ..() + if(stance == HOSTILE_STANCE_ATTACK || stance == HOSTILE_STANCE_ATTACKING) + if(punishCommies()) + lastPunish = world.time + +/mob/living/simple_animal/hostile/old_vendotron/proc/punishCommies() + if(lastPunish + punishCooldown <= world.time) + if(prob(15)) + ourVendor.platesPlatesPlates(30) + return TRUE + if(prob(20)) + ourVendor.broadSideBarrage() + return TRUE + if(prob(5)) + ourVendor.ghettoNightmare(3) + if(prob(10)) + ourVendor.youHaveToEatAllTheEggs(3) + return TRUE + if(prob(10)) + ourVendor.ahhSpiders(10) + return TRUE + return FALSE diff --git a/code/modules/events/old_vendotron_event/vendor_crash_event.dm b/code/modules/events/old_vendotron_event/vendor_crash_event.dm new file mode 100644 index 00000000000..247ac9cbe17 --- /dev/null +++ b/code/modules/events/old_vendotron_event/vendor_crash_event.dm @@ -0,0 +1,53 @@ +/datum/event/old_vendotron_crash + endWhen = 15 + announceWhen = 5 + +/datum/event/old_vendotron_crash/can_start() + return 5 + +/datum/event/old_vendotron_crash/setup() + startWhen = rand(5, 15) + +/datum/event/old_vendotron_crash/announce() + command_alert(/datum/command_alert/old_vendotron_crash) + +/datum/event/old_vendotron_crash/start() + launchVendor() + +/datum/event/old_vendotron_crash/proc/launchVendor() + var/turf/startPoint = random_start_turf(1) + var/obj/item/projectile/immovablerod/vending/vRod = new /obj/item/projectile/immovablerod/vending(startPoint) + var/obj/machinery/vending/old_vendotron/theVend = new /obj/machinery/vending/old_vendotron(vRod) + vRod.myVend = theVend + var/turf/endPoint = locate(map.center_x, map.center_y, 1) + vRod.throw_at(endPoint) + +/obj/item/projectile/immovablerod/vending + name = "\improper mid-collision space debris" + icon = 'icons/obj/vending.dmi' + icon_state = "Old_Vendotron" + var/collisionCount = 0 + var/obj/machinery/vending/old_vendotron/myVend = null + +/obj/item/projectile/immovablerod/vending/New() + ..() + collisionCount = rand(4, 6) + +/obj/item/projectile/immovablerod/vending/break_stuff() + if(loc.density) + loc.ex_act(2) + collisionCount-- + if(prob(25)) + clong() + if(collisionCount <= 0) + becomeVendor() + +/obj/item/projectile/immovablerod/vending/proc/becomeVendor() + myVend.forceMove(loc) + myVend.state = anchored + myVend.power_change() + qdel(src) + + + + diff --git a/code/modules/events/old_vendotron_event/vendor_teleport_event.dm b/code/modules/events/old_vendotron_event/vendor_teleport_event.dm new file mode 100644 index 00000000000..029a07bf768 --- /dev/null +++ b/code/modules/events/old_vendotron_event/vendor_teleport_event.dm @@ -0,0 +1,73 @@ +/datum/event/old_vendotron_teleport + endWhen = 15 + announceWhen = 5 + +/datum/event/old_vendotron_teleport/can_start() + return 15 + +/datum/event/old_vendotron_teleport/setup() + startWhen = rand(5, 15) + +/datum/event/old_vendotron_teleport/announce() + command_alert(/datum/command_alert/old_vendotron_teleport) + +/datum/event/old_vendotron_teleport/start() + teleportVendor() + +/datum/event/old_vendotron_teleport/proc/teleportVendor() + var/turf/vendT = vendSpawnDecide() + fancyEntrance(vendT) + +/datum/event/old_vendotron_teleport/proc/vendSpawnDecide() + var/list/dontSpawnHere = list( + /area/derelictparts, + /area/solar, + /area/assembly, //Because I don't know what that is + /area/shuttle/administration/station, + /area/ai_monitored/storage/emergency, + /area/arrival, + /area/shuttle/escape_pod1, + /area/shuttle/escape_pod2, + /area/shuttle/escape_pod3, + /area/shuttle/escape_pod4, + /area/shuttle/escape_pod5, + /area/shuttle/prison/, + ) + var/list/vendSpawnAreas = the_station_areas - dontSpawnHere + var/area/toSpawn = pick(vendSpawnAreas) + toSpawn = locate(toSpawn) + var/list/turf/simulated/floor/vendSpawn = list() + for(var/turf/simulated/floor/F in toSpawn) + if(!F.has_dense_content()) + vendSpawn.Add(F) + if(!vendSpawn.len) //Copy paste from infestation + message_admins("Old Vendotron event has failed! Could not find any viable turfs in [toSpawn].") + announceWhen = -1 + endWhen = 0 + return + return pick(vendSpawn) + +/datum/event/old_vendotron_teleport/proc/fancyEntrance(var/turf/vendT) + var/obj/effect/old_vendotron_entrance/E = new /obj/effect/old_vendotron_entrance(vendT) + E.aestheticEntrance() + playsound(E, 'sound/effects/eleczap.ogg', 100, 1) + spawn(4 SECONDS) + var/obj/machinery/vending/old_vendotron/OV = new /obj/machinery/vending/old_vendotron(vendT) + playsound(OV, 'sound/effects/coins.ogg', 100, 1) + +/obj/effect/old_vendotron_entrance + name = "unknown bluespace tear" + icon_state = "anom" + alpha = 0 + +/obj/effect/old_vendotron_entrance/New() + ..() + for(var/mob/dead/observer/people in observers) + to_chat(people, "\A [src] has been thrown at the station, Follow it") + +/obj/effect/old_vendotron_entrance/proc/aestheticEntrance() + animate(src, alpha = 255, transform = matrix()*2, time = 3 SECONDS) + spawn(3 SECONDS) + animate(src, icon_state = "bhole3", transform = matrix()*0.1, time = 3 SECONDS) + spawn(35) + qdel(E) diff --git a/icons/mob/old_vendotron.dmi b/icons/mob/old_vendotron.dmi new file mode 100644 index 00000000000..59aeb11c4e7 Binary files /dev/null and b/icons/mob/old_vendotron.dmi differ diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi index cbc8737512e..7c9aa46ddb5 100755 Binary files a/icons/obj/vending.dmi and b/icons/obj/vending.dmi differ diff --git a/vgstation13.dme b/vgstation13.dme index 519e2d71298..fcc6ef87cc6 100644 --- a/vgstation13.dme +++ b/vgstation13.dme @@ -1586,6 +1586,9 @@ #include "code\modules\events\viral_infection.dm" #include "code\modules\events\viral_outbreak.dm" #include "code\modules\events\wallrot.dm" +#include "code\modules\events\old_vendotron_event\old_vendotron.dm" +#include "code\modules\events\old_vendotron_event\vendor_crash_event.dm" +#include "code\modules\events\old_vendotron_event\vendor_teleport_event.dm" #include "code\modules\ext_scripts\copylogs.dm" #include "code\modules\ext_scripts\discord.dm" #include "code\modules\ext_scripts\irc.dm"