From dc79359d34e5a5b0cf72edc07581ae500a688d8a Mon Sep 17 00:00:00 2001 From: VerySoft Date: Mon, 27 Jun 2022 06:20:03 -0400 Subject: [PATCH] Me go sleeb --- code/game/objects/items/devices/paicard.dm | 2 +- code/game/objects/items/devices/paicard_vr.dm | 163 ++++++++++++++++++ code/modules/mob/living/silicon/pai/life.dm | 18 +- code/modules/mob/living/silicon/pai/pai.dm | 10 +- code/modules/mob/living/silicon/pai/pai_vr.dm | 21 ++- pai_vr64x32.dmi | Bin 186 -> 0 bytes vorestation.dme | 1 + 7 files changed, 207 insertions(+), 8 deletions(-) create mode 100644 code/game/objects/items/devices/paicard_vr.dm delete mode 100644 pai_vr64x32.dmi diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index d944c1ff3b4..ae8b3903819 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -117,7 +117,7 @@ GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/device/paicard) // VOREStation Edit End -/obj/item/device/paicard/attack_self(mob/user) +/obj/item/device/paicard/proc/access_screen(mob/user) if (!in_range(src, user)) return user.set_machine(src) diff --git a/code/game/objects/items/devices/paicard_vr.dm b/code/game/objects/items/devices/paicard_vr.dm new file mode 100644 index 00000000000..ea4c643b8b5 --- /dev/null +++ b/code/game/objects/items/devices/paicard_vr.dm @@ -0,0 +1,163 @@ +/obj/item/device/paicard + var/panel_open = FALSE + var/cell = TRUE //critical- power + var/processor = TRUE //critical- the thinky part + var/board = TRUE //critical- makes everything work + var/capacitor = TRUE //critical- power processing + var/projector = TRUE //non-critical- affects unfolding + var/emitter = TRUE //non-critical- affects unfolding + var/screen = TRUE //non-critical- affects screen + var/list/parts = list( + "cell", + "processor", + "board", + "capacitor", + "projector", + "emitter", + "screen") + +/obj/item/device/paicard/attackby(var/obj/item/I as obj, mob/user as mob) + if(istype(I,/obj/item/weapon/tool/screwdriver)) + if(panel_open) + panel_open = FALSE + user.visible_message("\The [user] secured \the [src]'s maintenance panel.") + else + panel_open = TRUE + user.visible_message("\The [user] opened \the [src]'s maintenance panel.") + if(istype(I,/obj/item/device/robotanalyzer)) + if(!panel_open) + to_chat(user, "The panel isn't open. You will need to unscrew it to open it.") + else + if(cell) + to_chat(user,"Power cell: functional") + else + to_chat(user,"Power cell: damaged - CRITICAL") + if(processor) + to_chat(user,"Processor: functional") + else + to_chat(user,"Processor: damaged - CRITICAL") + if(board) + to_chat(user,"Board: functional") + else + to_chat(user,"Board: damaged - CRITICAL") + if(capacitor) + to_chat(user,"Capacitors: functional") + else + to_chat(user,"Capacitors: damaged - CRITICAL") + if(projector) + to_chat(user,"Projectors: functional") + else + to_chat(user,"Projectors: damaged") + if(emitter) + to_chat(user,"Emitters: functional") + else + to_chat(user,"Emitters: damaged") + if(screen) + to_chat(user,"Screen: functional") + else + to_chat(user,"Screen: damaged") + if(istype(I,/obj/item/device/multitool)) + if(!panel_open) + to_chat(user, "You can't do that in this state.") + else + var/choice = tgui_input_list(user, "Which part would you like to check?", "Check part", parts) + switch(choice) + if("cell") + if(cell) + to_chat(user,"Power cell: functional") + else + to_chat(user,"Power cell: damaged") + if("processor") + if(processor) + to_chat(user,"Processor: functional") + else + to_chat(user,"Processor: damaged") + if("board") + if(board) + to_chat(user,"Board: functional") + else + to_chat(user,"Board: damaged") + if("capacitor") + if(capacitor) + to_chat(user,"Capacitors: functional") + else + to_chat(user,"Capacitors: damaged") + if("projector") + if(projector) + to_chat(user,"Projectors: functional") + else + to_chat(user,"Projectors: damaged") + if("emitter") + if(emitter) + to_chat(user,"Emitters: functional") + else + to_chat(user,"Emitters: damaged") + if("screen") + if(screen) + to_chat(user,"Screen: functional") + else + to_chat(user,"Screen: damaged") + +/obj/item/device/paicard/attack_self(mob/user) + if(!panel_open) + access_screen(user) + return + var/choice = tgui_input_list(user, "Which part would you like to remove?", "Remove part", parts) + switch(choice) + if("cell") + cell = FALSE + if(pai.stat != DEAD) + pai.death() + if("processor") + processor = FALSE + if(pai.stat != DEAD) + pai.death() + if("board") + board = FALSE + if(pai.stat != DEAD) + pai.death() + if("capacitor") + capacitor = FALSE + if(pai.stat != DEAD) + pai.death() + if("projector") + projector = FALSE + if("emitter") + emitter = FALSE + if("screen") + screen = FALSE + parts -= choice + +/obj/item/device/paicard/proc/death_damage() + + var/number = pick(1,4) + while(number) + switch(pick(1,4)) + if(1) + cell = FALSE + if(2) + processor = FALSE + if(3) + board = FALSE + if(4) + capacitor = FALSE + +/obj/item/device/paicard/proc/damage_random_component(nonfatal = FALSE) + if(prob(80) || nonfatal) //Way more likely to be non-fatal part damage + switch(pick(1,3)) + if(1) + projector = FALSE + if(2) + emitter = FALSE + if(3) + screen = FALSE + else + switch(pick(1,4)) + if(1) + cell = FALSE + if(2) + processor = FALSE + if(3) + board = FALSE + if(4) + capacitor = FALSE diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm index 773d628dfcf..20b4532b7f1 100644 --- a/code/modules/mob/living/silicon/pai/life.dm +++ b/code/modules/mob/living/silicon/pai/life.dm @@ -1,8 +1,5 @@ /mob/living/silicon/pai/Life() - if (src.stat == DEAD) - return - if(src.cable) if(get_dist(src, src.cable) > 1) var/turf/T = get_turf_or_move(src.loc) @@ -13,6 +10,21 @@ qdel(src.cable) src.cable = null + if (src.stat == DEAD) + return + + if(!card.cell || !card.processor || !card.board || !card.capacitor) + death() + + if(!card.projector && !card.emitter) + if(loc != card) + close_up() + to_chat(src, "ERROR: System malfunction. Service required!") + if(!card.projector || !card.emitter) + if(prob(5)) + close_up() + to_chat(src, "ERROR: System malfunction. Service recommended!") + handle_regular_hud_updates() handle_vision() diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 1f731fd4e91..7d6f73eed7b 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -171,7 +171,8 @@ /mob/living/silicon/pai/emp_act(severity) // Silence for 2 minutes - // 20% chance to kill + // 20% chance to damage critical components + // 50% chance to damage a non critical component // 33% chance to unbind // 33% chance to change prime directive (based on severity) // 33% chance of no additional effect @@ -180,10 +181,12 @@ to_chat(src, "Communication circuit overload. Shutting down and reloading communication circuits - speech and messaging functionality will be unavailable until the reboot is complete.") if(prob(20)) var/turf/T = get_turf_or_move(src.loc) + card.death_damage() for (var/mob/M in viewers(T)) M.show_message("A shower of sparks spray from [src]'s inner workings.", 3, "You hear and smell the ozone hiss of electrical sparks being expelled violently.", 2) - return src.death(0) - + return + if(prob(50)) + card.damage_random_component(TRUE) switch(pick(1,2,3)) if(1) src.master = null @@ -285,6 +288,7 @@ card.forceMove(src) card.screen_loc = null + canmove = TRUE var/turf/T = get_turf(src) if(istype(T)) T.visible_message("[src] folds outwards, expanding into a mobile form.") diff --git a/code/modules/mob/living/silicon/pai/pai_vr.dm b/code/modules/mob/living/silicon/pai/pai_vr.dm index 23bcb22aa9e..a13f21eca6d 100644 --- a/code/modules/mob/living/silicon/pai/pai_vr.dm +++ b/code/modules/mob/living/silicon/pai/pai_vr.dm @@ -67,8 +67,8 @@ /mob/living/silicon/pai/Login() . = ..() - last_special = world.time + 100 //Let's give get_character_icon time to work if(!holo_icon) + last_special = world.time + 100 //Let's give get_character_icon time to work get_character_icon() if(stat == DEAD) healths.icon_state = "health7" @@ -76,7 +76,14 @@ /mob/living/silicon/pai/proc/full_restore() adjustBruteLoss(- bruteloss) adjustFireLoss(- fireloss) + spawn(10) + card.cut_overlays() + card.setEmotion(16) + update_icon() + spawn(50) stat = CONSCIOUS + canmove = TRUE + card.setEmotion(15) /mob/living/silicon/pai/proc/pai_nom(var/mob/living/T in oview(1)) set name = "pAI Nom" @@ -628,3 +635,15 @@ icon = holo_icon else icon = holo_icon_north + +/mob/living/silicon/pai/adjustBruteLoss(amount, include_robo) + . = ..() + if(amount > 0 && health <= 90) //Something's probably attacking us! + if(prob(amount)) //The more damage it is doing, the more likely it is to damage something important! + card.damage_random_component() + +/mob/living/silicon/pai/adjustFireLoss(amount, include_robo) + . = ..() + if(amount > 0 && health <= 90) + if(prob(amount)) + card.damage_random_component() diff --git a/pai_vr64x32.dmi b/pai_vr64x32.dmi deleted file mode 100644 index c9d58c0a2403983906a1de4228453ac8a1bf460c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@$P6SM9iG1hQp^E9A+A7rd6n%gAjMb`eukTAW;zSx}OhpU1#ZF(){zps4iwm*9erU!Q1s>uQ}lb3S-OsKG_! z2aj~l`)HnIDC+6mVPPC(eA(EmLB?2EFO@aiUVH-^!zU^JqWUEv?||m=db&7