From 1345ee5a5c516aaeb5ec666e37c0c290c310ae11 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Thu, 17 Jul 2014 23:09:47 +0930 Subject: [PATCH] Initial commit for mobile pAIs. Almost guaranteed to be broken as shit. --- code/game/objects/items/devices/paicard.dm | 5 +- code/modules/mob/living/silicon/pai/pai.dm | 154 +++++++++++++++++++-- code/modules/mob/living/silicon/say.dm | 6 +- code/modules/mob/living/silicon/silicon.dm | 7 +- icons/mob/pai.dmi | Bin 0 -> 8145 bytes 5 files changed, 157 insertions(+), 15 deletions(-) create mode 100644 icons/mob/pai.dmi diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index 274f8f7ed7..42651ea720 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -197,7 +197,7 @@ pAI Request Module

Requesting AI personalities from central database... If there are no entries, or if a suitable entry is not listed, check again later as more personalities may be added.

Searching for personalities

- +
@@ -302,5 +302,4 @@ /obj/item/device/paicard/emp_act(severity) for(var/mob/M in src) M.emp_act(severity) - ..() - + ..() \ No newline at end of file diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 95e6dac83e..b3abbbd0fb 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -1,10 +1,12 @@ /mob/living/silicon/pai name = "pAI" - icon = 'icons/mob/mob.dmi'// - icon_state = "shadow" + icon = 'icons/mob/pai.dmi' + icon_state = "repairbot" robot_talk_understand = 0 emote_type = 2 // pAIs emotes are heard, not seen, so they can be seen through a container (eg. person) + small = 1 + pass_flags = 1 var/network = "SS13" var/obj/machinery/camera/current = null @@ -15,10 +17,9 @@ var/obj/item/device/paicard/card // The card we inhabit var/obj/item/device/radio/radio // Our primary radio - var/speakStatement = "states" - var/speakExclamation = "declares" - var/speakQuery = "queries" - + var/list/possible_chassis // A list of chassis to choose from. + var/list/possible_say_verbs // A list of speech verbs to choose from. + var/chassis = "repairbot" // A record of your chosen chassis. var/obj/item/weapon/pai_cable/cable // The cable we produce and use when door or camera jacking @@ -54,6 +55,7 @@ /mob/living/silicon/pai/New(var/obj/item/device/paicard) + canmove = 0 src.loc = paicard card = paicard @@ -68,6 +70,10 @@ add_language("Tradeband", 1) add_language("Gutter", 1) + verbs += /mob/living/silicon/pai/proc/fold_out + verbs += /mob/living/silicon/pai/proc/choose_chassis + verbs += /mob/living/silicon/pai/proc/choose_verbs + //PDA pda = new(src) spawn(5) @@ -77,6 +83,20 @@ pda.toff = 1 ..() + possible_chassis = list( + "Drone" = "repairbot", + "Cat" = "cat", + "Mouse" = "mouse" + ) + + possible_say_verbs = list( + "Robotic" = list("states","declares","queries"), + "Natural" = list("says","yells","asks"), + "Beep" = list("beeps","beeps loudly","boops"), + "Chirp" = list("chirps","chirrups","cheeps"), + "Feline" = list("purrs","yowls","meows") + ) + /mob/living/silicon/pai/Login() ..() usr << browse_rsc('html/paigrid.png') // Go ahead and cache the interface resources as early as possible @@ -113,7 +133,9 @@ return 0 /mob/living/silicon/pai/restrained() - return 0 + if(istype(src.loc,/obj/item/device/paicard)) + return 0 + ..() /mob/living/silicon/pai/emp_act(severity) // Silence for 2 minutes @@ -231,7 +253,6 @@ src.reset_view(C) return 1 - /mob/living/silicon/pai/cancel_camera() set category = "pAI Commands" set name = "Cancel Camera View" @@ -239,6 +260,123 @@ src.unset_machine() src:cameraFollow = null +//This is used to convert the stationary pai item into a mobile pai mob. +/mob/living/silicon/pai/proc/fold_out() + set category = "pAI Commands" + set name = "Unfold Chassis" + + if(stat || sleeping || paralysis || weakened) + return + + if(src.loc != card) + return + + verbs -= /mob/living/silicon/pai/proc/fold_out + verbs += /mob/living/silicon/pai/proc/fold_up + + var/turf/T = get_turf(src) + if(istype(T)) T.visible_message("[src] folds outwards, expanding into a mobile form.") + canmove = 1 + + //I'm not sure how much of this is necessary, but I would rather avoid issues. + if(istype(card.loc,/mob)) + var/mob/M = card.loc + M.drop_item(card) + + src.client.perspective = EYE_PERSPECTIVE + src.client.eye = src + + src.loc = get_turf(card) + card.loc = src + src.forceMove(get_turf(card)) + card.forceMove(src) + +/mob/living/silicon/pai/proc/fold_up() + set category = "pAI Commands" + set name = "Condense Chassis" + + if(stat || sleeping || paralysis || weakened) + return + + if(src.loc == card) + return + + close_up() + +/mob/living/silicon/pai/proc/choose_chassis() + set category = "pAI Commands" + set name = "Choose Chassis" + + var/choice + var/finalized = "No" + while(finalized == "No" && src.client) + + choice = input(usr,"What would you like to use for your mobile chassis icon? This decision can only be made once.") as null|anything in possible_chassis + if(!choice) return + + icon_state = possible_chassis[choice] + finalized = alert("Look at your sprite. Is this what you wish to use?",,"No","Yes") + + chassis = possible_chassis[choice] + verbs -= /mob/living/silicon/pai/proc/choose_chassis + +/mob/living/silicon/pai/proc/choose_verbs() + set category = "pAI Commands" + set name = "Choose Speech Verbs" + + var/choice = input(usr,"What theme would you like to use for your speech verbs? This decision can only be made once.") as null|anything in possible_say_verbs + if(!choice) return + + var/list/sayverbs = possible_say_verbs[choice] + speak_statement = sayverbs[1] + speak_exclamation = sayverbs[(sayverbs.len>1 ? 2 : sayverbs.len)] + speak_query = sayverbs[(sayverbs.len>2 ? 3 : sayverbs.len)] + + verbs -= /mob/living/silicon/pai/proc/choose_verbs + +/mob/living/silicon/pai/lay_down() + set name = "Rest" + set category = "IC" + + if(istype(src.loc,/obj/item/device/paicard)) + resting = 0 + else + resting = !resting + icon_state = resting ? "[chassis]_rest" : "[chassis]" + src << "\blue You are now [resting ? "resting" : "getting up"]" + + canmove = !resting + +//Overriding this will stop a number of headaches down the track. +/mob/living/silicon/pai/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(W.force) + visible_message("[user.name] attacks [src] with [W]!") + src.adjustBruteLoss(W.force) + src.updatehealth() + else + visible_message("[user.name] bonks [src] harmlessly with [W].") + if(stat != 2) close_up() + return + +//I'm not sure how much of this is necessary, but I would rather avoid issues. +/mob/living/silicon/pai/proc/close_up() + + verbs -= /mob/living/silicon/pai/proc/fold_up + verbs += /mob/living/silicon/pai/proc/fold_out + + var/turf/T = get_turf(src) + if(istype(T)) T.visible_message("[src] neatly folds inwards, compacting down to a rectangular card.") + + src.stop_pulling() + src.client.perspective = EYE_PERSPECTIVE + src.client.eye = card + + src.loc = card + card.loc = get_turf(card) + src.forceMove(card) + card.forceMove(card.loc) + canmove = 0 + //Addition by Mord_Sith to define AI's network change ability /* /mob/living/silicon/pai/proc/pai_network_change() diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index 57f2f24aa3..fa0d16798a 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -2,11 +2,11 @@ var/ending = copytext(text, length(text)) if (ending == "?") - return "queries" + return speak_query else if (ending == "!") - return "declares" + return speak_exclamation - return "states" + return speak_statement #define IS_AI 1 #define IS_ROBOT 2 diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index def2381776..99adb65ed0 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -8,6 +8,11 @@ var/list/hud_list[9] var/list/speech_synthesizer_langs = list() //which languages can be vocalized by the speech synthesizer + //Used in say.dm. + var/speak_statement = "states" + var/speak_exclamation = "declares" + var/speak_query = "queries" + /mob/living/silicon/proc/show_laws() return @@ -141,7 +146,7 @@ /mob/living/silicon/remove_language(var/rem_language) ..(rem_language) - + for (var/datum/language/L in speech_synthesizer_langs) if (L.name == rem_language) speech_synthesizer_langs -= L diff --git a/icons/mob/pai.dmi b/icons/mob/pai.dmi new file mode 100644 index 0000000000000000000000000000000000000000..91582667dd066e6e1323f6621b1b76dabb637478 GIT binary patch literal 8145 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 literal 0 HcmV?d00001