mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-07-30 17:26:32 +01:00
4ecb0bc21c
Repaths obj/machinery to obj/structure/machinery. **Note for reviewers:** the only meaningful changed code exists within **code/game/objects/structures.dm** and **code/game/objects/structures/_machinery.dm**, largely concerning damage procs. With the exception of moving airlock defines to their own file, ALL OTHER CHANGES ARE STRICTLY PATH CHANGES. Objects, _categorically_, are largely divided between those you can hold in your hand/inventory and those you can't. Machinery objects are already subtypes of Structures behaviorally, this PR just makes their pathing reflect that, and allows for future work (tool actions, more health/destruction functionality) to be developed without unnecessary code duplication. I have tested this PR by loading up the Horizon and dismantling various machines and structures with tools, shooting guns of various types throughout the ship, and detonating a bunch of explosions throughout the ship.
260 lines
7.9 KiB
Plaintext
260 lines
7.9 KiB
Plaintext
/obj/structure/machinery/computer/arcade/
|
|
name = "random arcade"
|
|
desc = "random arcade machine"
|
|
icon = 'icons/obj/computer.dmi'
|
|
icon_state = "arcade2"
|
|
icon_screen = "battler"
|
|
icon_broken = "broken-arcade"
|
|
var/prize = /obj/random/arcade
|
|
|
|
/obj/structure/machinery/computer/arcade/Initialize()
|
|
. = ..()
|
|
// If it's a generic arcade machine, pick a random arcade
|
|
// circuit board for it and make the new machine
|
|
if(!circuit)
|
|
var/choice = pick(typesof(/obj/item/circuitboard/arcade) - /obj/item/circuitboard/arcade)
|
|
var/obj/item/circuitboard/CB = new choice()
|
|
new CB.build_path(loc, CB)
|
|
|
|
return INITIALIZE_HINT_QDEL
|
|
|
|
/obj/structure/machinery/computer/arcade/proc/prizevend()
|
|
if(!contents.len)
|
|
new prize(src.loc)
|
|
else
|
|
var/atom/movable/chosen_prize = pick(contents)
|
|
chosen_prize.forceMove(src.loc)
|
|
|
|
/obj/structure/machinery/computer/arcade/attack_ai(mob/user as mob)
|
|
if(!ai_can_interact(user))
|
|
return
|
|
return src.attack_hand(user)
|
|
|
|
/obj/structure/machinery/computer/arcade/emp_act(severity)
|
|
. = ..()
|
|
|
|
if(stat & (NOPOWER|BROKEN))
|
|
return
|
|
|
|
var/num_of_prizes = 0
|
|
switch(severity)
|
|
if(EMP_HEAVY)
|
|
num_of_prizes = rand(1,4)
|
|
if(EMP_LIGHT)
|
|
num_of_prizes = rand(0,2)
|
|
for(num_of_prizes; num_of_prizes > 0; num_of_prizes--)
|
|
new prize(src.loc)
|
|
|
|
|
|
///////////////////
|
|
// BATTLE HERE //
|
|
///////////////////
|
|
|
|
/obj/structure/machinery/computer/arcade/battle
|
|
name = "arcade machine"
|
|
desc = "Does not support Pinball."
|
|
icon_state = "arcade2"
|
|
icon_screen = "battler"
|
|
circuit = /obj/item/circuitboard/arcade/battle
|
|
var/enemy_name = "Space Villian"
|
|
var/temp = "Winners don't use space drugs" //Temporary message, for attack messages, etc
|
|
var/player_hp = 30 //Player health/attack points
|
|
var/player_mp = 10
|
|
var/enemy_hp = 45 //Enemy health/attack points
|
|
var/enemy_mp = 20
|
|
var/gameover = 0
|
|
var/blocked = 0 //Player cannot attack/heal while set
|
|
var/turtle = 0
|
|
|
|
/obj/structure/machinery/computer/arcade/battle/Initialize()
|
|
. = ..()
|
|
var/name_action
|
|
var/name_part1
|
|
var/name_part2
|
|
|
|
name_action = pick("Defeat ", "Annihilate ", "Save ", "Strike ", "Stop ", "Destroy ", "Robust ", "Romance ", "Pwn ", "Own ", "Ban ")
|
|
|
|
name_part1 = pick("the Automatic ", "Farmer ", "Lord ", "Professor ", "the Cuban ", "the Evil ", "the Dread King ", "the Space ", "Lord ", "the Great ", "Duke ", "General ")
|
|
name_part2 = pick("Melonoid", "Murdertron", "Sorcerer", "Ruin", "Jeff", "Ectoplasm", "Crushulon", "Uhangoid", "Vhakoid", "Peteoid", "slime", "Griefer", "ERPer", "Lizard Man", "Unicorn", "Bloopers")
|
|
|
|
src.enemy_name = replacetext((name_part1 + name_part2), "the ", "")
|
|
src.name = (name_action + name_part1 + name_part2)
|
|
|
|
|
|
/obj/structure/machinery/computer/arcade/battle/attack_hand(mob/user as mob)
|
|
if(..())
|
|
return
|
|
user.set_machine(src)
|
|
var/dat = ""
|
|
dat += "<center><h3>[src.enemy_name]</h3></center>"
|
|
dat += "<br><center><h2>[src.temp]</h2></center>"
|
|
dat += "<br><center>Health: [src.player_hp] | Magic: [src.player_mp] | Enemy Health: [src.enemy_hp]</center>"
|
|
|
|
dat += "<center><b>"
|
|
if (src.gameover)
|
|
dat += "<a href='byond://?src=[REF(src)];newgame=1'>New Game</a>"
|
|
else
|
|
dat += "<a href='byond://?src=[REF(src)];attack=1'>Attack</a> | "
|
|
dat += "<a href='byond://?src=[REF(src)];heal=1'>Heal</a> | "
|
|
dat += "<a href='byond://?src=[REF(src)];charge=1'>Recharge Power</a>"
|
|
|
|
dat += "</b></center>"
|
|
|
|
|
|
var/datum/browser/arcade_win = new(user, "arcade", capitalize_first_letters(name))
|
|
arcade_win.set_content(dat)
|
|
arcade_win.open()
|
|
|
|
/obj/structure/machinery/computer/arcade/battle/Topic(href, href_list)
|
|
if(..())
|
|
return 1
|
|
|
|
if (!src.blocked && !src.gameover)
|
|
if (href_list["attack"])
|
|
src.blocked = 1
|
|
var/attackamt = rand(2,6)
|
|
src.temp = "You attack for [attackamt] damage!"
|
|
playsound(loc, 'sound/arcade/hit.ogg', 5, 1, extrarange = -3, falloff_distance = 10, required_asfx_toggles = ASFX_ARCADE)
|
|
src.updateUsrDialog()
|
|
if(turtle > 0)
|
|
turtle--
|
|
|
|
sleep(10)
|
|
src.enemy_hp -= attackamt
|
|
src.arcade_action()
|
|
|
|
else if (href_list["heal"])
|
|
src.blocked = 1
|
|
var/pointamt = rand(1,3)
|
|
var/healamt = rand(6,8)
|
|
src.temp = "You use [pointamt] magic to heal for [healamt] damage!"
|
|
playsound(loc, 'sound/arcade/heal.ogg', 2, 1, extrarange = -3, falloff_distance = 10, required_asfx_toggles = ASFX_ARCADE)
|
|
src.updateUsrDialog()
|
|
turtle++
|
|
|
|
sleep(10)
|
|
src.player_mp -= pointamt
|
|
src.player_hp += healamt
|
|
src.blocked = 1
|
|
src.updateUsrDialog()
|
|
src.arcade_action()
|
|
|
|
else if (href_list["charge"])
|
|
src.blocked = 1
|
|
var/chargeamt = rand(4,7)
|
|
src.temp = "You regain [chargeamt] points."
|
|
playsound(loc, 'sound/arcade/mana.ogg', 1, 1, extrarange = -3, falloff_distance = 10, required_asfx_toggles = ASFX_ARCADE)
|
|
src.player_mp += chargeamt
|
|
if(turtle > 0)
|
|
turtle--
|
|
|
|
src.updateUsrDialog()
|
|
sleep(10)
|
|
src.arcade_action()
|
|
|
|
if (href_list["close"])
|
|
usr.unset_machine()
|
|
usr << browse(null, "window=arcade")
|
|
|
|
else if (href_list["newgame"]) //Reset everything
|
|
temp = "New Round"
|
|
player_hp = 30
|
|
player_mp = 10
|
|
enemy_hp = 45
|
|
enemy_mp = 20
|
|
gameover = 0
|
|
turtle = 0
|
|
|
|
if(emagged)
|
|
src.New()
|
|
emagged = 0
|
|
|
|
src.add_fingerprint(usr)
|
|
src.updateUsrDialog()
|
|
return
|
|
|
|
/obj/structure/machinery/computer/arcade/battle/proc/arcade_action()
|
|
if ((src.enemy_mp <= 0) || (src.enemy_hp <= 0))
|
|
if(!gameover)
|
|
src.gameover = 1
|
|
src.temp = "[src.enemy_name] has fallen! Rejoice!"
|
|
playsound(loc, 'sound/arcade/win.ogg', 5, 1, extrarange = -3, falloff_distance = 10, required_asfx_toggles = ASFX_ARCADE)
|
|
|
|
if(emagged)
|
|
feedback_inc("arcade_win_emagged")
|
|
new /obj/effect/spawner/newbomb/timer/syndicate(src.loc)
|
|
new /obj/item/clothing/head/collectable/petehat(src.loc)
|
|
message_admins("[key_name_admin(usr)] has outbombed Cuban Pete and been awarded a bomb.")
|
|
log_game("[key_name_admin(usr)] has outbombed Cuban Pete and been awarded a bomb.")
|
|
src.New()
|
|
emagged = 0
|
|
else
|
|
feedback_inc("arcade_win_normal")
|
|
src.prizevend()
|
|
|
|
else if (emagged && (turtle >= 4))
|
|
var/boomamt = rand(5,10)
|
|
src.temp = "[src.enemy_name] throws a bomb, exploding you for [boomamt] damage!"
|
|
playsound(loc, 'sound/arcade/boom.ogg', 5, 1, extrarange = -3, falloff_distance = 10, required_asfx_toggles = ASFX_ARCADE)
|
|
src.player_hp -= boomamt
|
|
|
|
else if ((src.enemy_mp <= 5) && (prob(70)))
|
|
var/stealamt = rand(2,3)
|
|
src.temp = "[src.enemy_name] steals [stealamt] of your power!"
|
|
playsound(loc, 'sound/arcade/steal.ogg', 5, 1, extrarange = -3, falloff_distance = 10, required_asfx_toggles = ASFX_ARCADE)
|
|
src.player_mp -= stealamt
|
|
src.updateUsrDialog()
|
|
|
|
if (src.player_mp <= 0)
|
|
src.gameover = 1
|
|
sleep(10)
|
|
src.temp = "You have been drained! GAME OVER"
|
|
if(emagged)
|
|
feedback_inc("arcade_loss_mana_emagged")
|
|
usr.gib()
|
|
else
|
|
feedback_inc("arcade_loss_mana_normal")
|
|
|
|
else if ((src.enemy_hp <= 10) && (src.enemy_mp > 4))
|
|
src.temp = "[src.enemy_name] heals for 4 health!"
|
|
playsound(loc, 'sound/arcade/heal.ogg', 5, 1, extrarange = -3, falloff_distance = 10, required_asfx_toggles = ASFX_ARCADE)
|
|
src.enemy_hp += 4
|
|
src.enemy_mp -= 4
|
|
|
|
else
|
|
var/attackamt = rand(3,6)
|
|
src.temp = "[src.enemy_name] attacks for [attackamt] damage!"
|
|
playsound(loc, 'sound/arcade/hit.ogg', 5, 1, extrarange = -3, falloff_distance = 10, required_asfx_toggles = ASFX_ARCADE)
|
|
src.player_hp -= attackamt
|
|
|
|
if ((src.player_mp <= 0) || (src.player_hp <= 0))
|
|
src.gameover = 1
|
|
src.temp = "You have been crushed! GAME OVER"
|
|
playsound(loc, 'sound/arcade/lose.ogg', 5, 1, extrarange = -3, falloff_distance = 10, required_asfx_toggles = ASFX_ARCADE)
|
|
if(emagged)
|
|
feedback_inc("arcade_loss_hp_emagged")
|
|
usr.gib()
|
|
else
|
|
feedback_inc("arcade_loss_hp_normal")
|
|
|
|
src.blocked = 0
|
|
return
|
|
|
|
|
|
/obj/structure/machinery/computer/arcade/battle/emag_act(var/charges, var/mob/user)
|
|
if(!emagged)
|
|
temp = "If you die in the game, you die for real!"
|
|
player_hp = 30
|
|
player_mp = 10
|
|
enemy_hp = 45
|
|
enemy_mp = 20
|
|
gameover = 0
|
|
blocked = 0
|
|
emagged = 1
|
|
|
|
enemy_name = "Cuban Pete"
|
|
name = "Outbomb Cuban Pete"
|
|
|
|
src.updateUsrDialog()
|
|
return 1
|