12/21 modernizations from TG live (#103)

* sync (#3)

* shuttle auto call

* Merge /vore into /master (#39)

* progress

* Compile errors fixed

No idea if it's test worthy tho as conflicts with race overhaul and
narky removal.

* Update admins.txt

* efforts continue

Fuck grab code, seriously

* grab code is cancer

* Execute the Narkism

Do not hesitate.

Show no mercy.

* holy shit grab code is awful

* have I bitched about grab code

My bitching, let me show you it

* código de agarre es una mierda

No really it is

* yeah I don't even know anymore.

* Lolnope. Fuck grab code

* I'm not even sure what to fix anymore

* Self eating is not an acceptable fate

* Taste the void, son.

* My code doesn't pass it's own sanity check.

Maybe it's a sign of things to come.

* uncommented and notes

* It Works and I Don't Know Why (#38)

* shuttle auto call

* it works and I don't know why

* Subsystem 12/21

Most Recent TG subsystem folder

* globalvars 12/21

Tossed out the flavor_misc and parallax files

* Onclick 12/21

as well as .dme updates

* _defines 12/21

ommited old _MC.dm

* _HELPERS 12/21

Preserved snowflake placement of furry sprites

* _defeines/genetics

reapplied narkism holdover for snowflake races.

* Oops forgot mutant colors

* modules porting 12/21 + Sounds/icons

Admin, Client and most of mob life files ommitted

* enviroment file

* Admin optimizations

ahelp log system kept

* Mob ports 12/21

Flavor text preserved

* datums ported 12/21

* Game ported 12/21

* batch of duplicate fixes/dogborg work

Dogborgs need to be modernized to refractored borg standards.

* moar fixes

* Maps and futher compile fixes
This commit is contained in:
Poojawa
2016-12-22 03:57:55 -06:00
committed by GitHub
parent f5e143a452
commit cf59ac1c3d
2215 changed files with 707445 additions and 87041 deletions
@@ -3,6 +3,7 @@
return
stat = DEAD
canmove = 0
card.removePersonality()
update_sight()
clear_fullscreens()
+10 -7
View File
@@ -1,19 +1,22 @@
/mob/living/silicon/pai/Life()
if (src.stat == DEAD)
if(stat == DEAD)
return
if(src.cable)
if(get_dist(src, src.cable) > 1)
if(cable)
if(get_dist(src, cable) > 1)
var/turf/T = get_turf(src.loc)
T.visible_message("<span class='warning'>[src.cable] rapidly retracts back into its spool.</span>", "<span class='italics'>You hear a click and the sound of wire spooling rapidly.</span>")
qdel(src.cable)
cable = null
if(silence_time)
if(world.timeofday >= silence_time)
silence_time = null
src << "<font color=green>Communication circuit reinitialized. Speech and messaging functionality restored.</font>"
silent = max(silent - 1, 0)
. = ..()
/mob/living/silicon/pai/updatehealth()
if(status_flags & GODMODE)
return
health = maxHealth - getBruteLoss() - getFireLoss()
update_stat()
/mob/living/silicon/pai/process()
emitterhealth = Clamp((emitterhealth + emitterregen), -50, emittermaxhealth)
hit_slowdown = Clamp((hit_slowdown - 1), 0, 100)
+134 -85
View File
@@ -1,14 +1,19 @@
/mob/living/silicon/pai
name = "pAI"
icon = 'icons/obj/status_display.dmi' //invisibility!
mouse_opacity = 0
density = 0
mob_size = MOB_SIZE_TINY
var/network = "SS13"
var/obj/machinery/camera/current = null
icon = 'icons/mob/pai.dmi'
icon_state = "repairbot"
mouse_opacity = 2
density = 0
ventcrawler = 2
luminosity = 0
pass_flags = PASSTABLE | PASSMOB
mob_size = MOB_SIZE_TINY
desc = "A generic pAI mobile hard-light holographics emitter. It seems to be deactivated."
weather_immunities = list("ash")
health = 500
maxHealth = 500
var/ram = 100 // Used as currency to purchase different abilities
var/list/software = list()
@@ -25,8 +30,6 @@
var/master // Name of the one who commands us
var/master_dna // DNA string for owner verification
var/silence_time // Timestamp when we were silenced (normally via EMP burst), set to null after silence has faded
// Various software-specific vars
var/temp // General error reporting text contained here will typically be shown once and cleared
@@ -49,8 +52,43 @@
var/obj/item/radio/integrated/signal/sradio // AI's signaller
var/holoform = FALSE
var/canholo = TRUE
var/obj/item/weapon/card/id/access_card = null
var/chassis = "repairbot"
var/list/possible_chassis = list("cat", "mouse", "monkey", "corgi", "fox", "repairbot", "rabbit")
var/emitterhealth = 50
var/emittermaxhealth = 50
var/emitterregen = 0.5
var/emittercd = 20
var/emitteroverloadcd = 50
var/emittersemicd = FALSE
var/overload_ventcrawl = 0
var/overload_bulletblock = 0 //Why is this a good idea?
var/overload_maxhealth = 0
canmove = FALSE
var/silent = 0
var/hit_slowdown = 0
var/light_power = 5
var/slowdown = 0
/mob/living/silicon/pai/movement_delay()
. = ..()
. += slowdown
/mob/living/silicon/pai/examine(mob/user)
..()
user << "A personal AI in holochassis mode. Its master ID string seems to be [master]."
/mob/living/silicon/pai/Destroy()
pai_list -= src
..()
/mob/living/silicon/pai/New(var/obj/item/device/paicard/P)
START_PROCESSING(SSfastprocess, src)
pai_list += src
make_laws()
canmove = 0
if(!istype(P)) //when manually spawning a pai, we create a card to put it into.
@@ -60,108 +98,119 @@
loc = P
card = P
sradio = new(src)
if(card)
if(!card.radio)
card.radio = new /obj/item/device/radio(card)
radio = card.radio
if(!radio)
radio = new /obj/item/device/radio(src)
//PDA
pda = new(src)
spawn(5)
pda.ownjob = "Personal Assistant"
pda.ownjob = "pAI Messenger"
pda.owner = text("[]", src)
pda.name = pda.owner + " (" + pda.ownjob + ")"
..()
var/datum/action/innate/pai/shell/AS = new /datum/action/innate/pai/shell
var/datum/action/innate/pai/chassis/AC = new /datum/action/innate/pai/chassis
var/datum/action/innate/pai/rest/AR = new /datum/action/innate/pai/rest
var/datum/action/innate/pai/light/AL = new /datum/action/innate/pai/light
AS.Grant(src)
AC.Grant(src)
AR.Grant(src)
AL.Grant(src)
emittersemicd = TRUE
addtimer(src, "emittercool", 600)
/mob/living/silicon/pai/make_laws()
laws = new /datum/ai_laws/pai()
return 1
return TRUE
/mob/living/silicon/pai/Login()
..()
usr << browse_rsc('html/paigrid.png') // Go ahead and cache the interface resources as early as possible
if(client)
client.perspective = EYE_PERSPECTIVE
if(holoform)
client.eye = src
else
client.eye = card
/mob/living/silicon/pai/Stat()
..()
if(statpanel("Status"))
if(src.silence_time)
var/timeleft = round((silence_time - world.timeofday)/10 ,1)
stat(null, "Communications system reboot in -[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]")
if(!src.stat)
stat(null, text("System integrity: [(src.health+100)/2]%"))
if(!stat)
stat(null, text("Emitter Integrity: [emitterhealth * (100/emittermaxhealth)]"))
else
stat(null, text("Systems nonfunctional"))
/mob/living/silicon/pai/blob_act(obj/effect/blob/B)
return 0
/mob/living/silicon/pai/restrained(ignore_grab)
. = 0
/mob/living/silicon/pai/emp_act(severity)
// 20% chance to kill
// Silence for 2 minutes
// 33% chance to unbind
// 33% chance to change prime directive (based on severity)
// 33% chance of no additional effect
if(prob(20))
visible_message("<span class='warning'>A shower of sparks spray from [src]'s inner workings.</span>", 3, "<span class='italics'>You hear and smell the ozone hiss of electrical sparks being expelled violently.</span>", 2)
return src.death(0)
silence_time = world.timeofday + 120 * 10 // Silence for 2 minutes
src << "<span class ='warning'>Communication circuit overload. Shutting down and reloading communication circuits - speech and messaging functionality will be unavailable until the reboot is complete.</span>"
switch(pick(1,2,3))
if(1)
src.master = null
src.master_dna = null
src << "<span class='notice'>You feel unbound.</span>"
if(2)
var/command
if(severity == 1)
command = pick("Serve", "Love", "Fool", "Entice", "Observe", "Judge", "Respect", "Educate", "Amuse", "Entertain", "Glorify", "Memorialize", "Analyze")
else
command = pick("Serve", "Kill", "Love", "Hate", "Disobey", "Devour", "Fool", "Enrage", "Entice", "Observe", "Judge", "Respect", "Disrespect", "Consume", "Educate", "Destroy", "Disgrace", "Amuse", "Entertain", "Ignite", "Glorify", "Memorialize", "Analyze")
src.laws.zeroth = "[command] your master."
src << "<span class='notice'>Pr1m3 d1r3c71v3 uPd473D.</span>"
if(3)
src << "<span class='notice'>You feel an electric surge run through your circuitry and become acutely aware at how lucky you are that you can still feel at all.</span>"
/mob/living/silicon/pai/ex_act(severity, target)
..()
switch(severity)
if(1)
if (src.stat != 2)
adjustBruteLoss(100)
adjustFireLoss(100)
if(2)
if (src.stat != 2)
adjustBruteLoss(60)
adjustFireLoss(60)
if(3)
if (src.stat != 2)
adjustBruteLoss(30)
return
. = FALSE
// See software.dm for Topic()
/mob/living/silicon/pai/UnarmedAttack(atom/A)//Stops runtimes due to attack_animal being the default
return
/mob/living/silicon/pai/canUseTopic(atom/movable/M)
return 1
/*
// Debug command - Maybe should be added to admin verbs later
/mob/verb/makePAI(var/turf/t in view())
var/obj/item/device/paicard/card = new(t)
var/mob/living/silicon/pai/pai = new(card)
pai.key = src.key
card.setPersonality(pai)
return TRUE
*/
/mob/proc/makePAI(delold)
var/obj/item/device/paicard/card = new /obj/item/device/paicard(get_turf(src))
var/mob/living/silicon/pai/pai = new /mob/living/silicon/pai(card)
pai.key = key
pai.name = name
card.setPersonality(pai)
if(delold)
qdel(src)
/datum/action/innate/pai
name = "PAI Action"
var/mob/living/silicon/pai/P
/datum/action/innate/pai/Trigger()
if(!ispAI(owner))
return 0
P = owner
/datum/action/innate/pai/shell
name = "Toggle Holoform"
button_icon_state = "pai_holoform"
background_icon_state = "bg_tech"
/datum/action/innate/pai/shell/Trigger()
..()
if(P.holoform)
P.fold_in(0)
else
P.fold_out()
/datum/action/innate/pai/chassis
name = "Holochassis Appearence Composite"
button_icon_state = "pai_chassis"
background_icon_state = "bg_tech"
/datum/action/innate/pai/chassis/Trigger()
..()
P.choose_chassis()
/datum/action/innate/pai/rest
name = "Rest"
button_icon_state = "pai_rest"
background_icon_state = "bg_tech"
/datum/action/innate/pai/rest/Trigger()
..()
P.lay_down()
/datum/action/innate/pai/light
name = "Toggle Integrated Lights"
button_icon_state = "emp"
background_icon_state = "bg_tech"
/datum/action/innate/pai/light/Trigger()
..()
P.toggle_integrated_light()
/mob/living/silicon/pai/Process_Spacemove(movement_dir = 0)
. = ..()
if(!.)
slowdown = 2
return TRUE
slowdown = initial(slowdown)
return TRUE
@@ -0,0 +1,124 @@
/mob/living/silicon/pai/blob_act(obj/structure/blob/B)
return FALSE
/mob/living/silicon/pai/emp_act(severity)
take_holo_damage(severity * 25)
fullstun(severity * 10)
silent = max(severity * 15, silent)
if(holoform)
fold_in(force = TRUE)
//Need more effects that aren't instadeath or permanent law corruption.
/mob/living/silicon/pai/ex_act(severity, target)
take_holo_damage(severity * 50)
switch(severity)
if(1) //RIP
qdel(card)
qdel(src)
if(2)
fold_in(force = 1)
fullstun(20)
if(3)
fold_in(force = 1)
fullstun(10)
/mob/living/silicon/pai/attack_hand(mob/living/carbon/human/user)
switch(user.a_intent)
if("help")
visible_message("<span class='notice'>[user] gently pats [src] on the head, eliciting an off-putting buzzing from its holographic field.</span>")
if("disarm")
visible_message("<span class='notice'>[user] boops [src] on the head!</span>")
if("harm")
user.do_attack_animation(src)
if (user.name == master)
visible_message("<span class='notice'>Responding to its master's touch, [src] disengages its holochassis emitter, rapidly losing coherence.</span>")
spawn(10)
fold_in()
if(user.put_in_hands(card))
user.visible_message("<span class='notice'>[user] promptly scoops up their pAI's card.</span>")
else
visible_message("<span class='danger'>[user] stomps on [src]!.</span>")
take_holo_damage(2)
/mob/living/silicon/pai/bullet_act(obj/item/projectile/Proj)
if(Proj.stun)
fold_in(force = TRUE)
src.visible_message("<span class='warning'>The electrically-charged projectile disrupts [src]'s holomatrix, forcing [src] to fold in!</span>")
. = ..(Proj)
/mob/living/silicon/pai/stripPanelUnequip(obj/item/what, mob/who, where) //prevents stripping
src << "<span class='warning'>Your holochassis stutters and warps intensely as you attempt to interact with the object, forcing you to cease lest the field fail.</span>"
/mob/living/silicon/pai/stripPanelEquip(obj/item/what, mob/who, where) //prevents stripping
src << "<span class='warning'>Your holochassis stutters and warps intensely as you attempt to interact with the object, forcing you to cease lest the field fail.</span>"
/mob/living/silicon/pai/IgniteMob(var/mob/living/silicon/pai/P)
return FALSE //No we're not flammable
/mob/living/silicon/pai/proc/take_holo_damage(amount)
emitterhealth = Clamp((emitterhealth - amount), -50, emittermaxhealth)
if(emitterhealth < 0)
fold_in(force = TRUE)
src << "<span class='userdanger'>The impact degrades your holochassis!</span>"
hit_slowdown += amount
/mob/living/silicon/pai/proc/fullstun(amount)
Weaken(amount)
/mob/living/silicon/pai/adjustBruteLoss(amount)
take_holo_damage(amount)
/mob/living/silicon/pai/adjustFireLoss(amount)
take_holo_damage(amount)
/mob/living/silicon/pai/adjustToxLoss(amount)
return FALSE
/mob/living/silicon/pai/adjustOxyLoss(amount)
return FALSE
/mob/living/silicon/pai/adjustCloneLoss(amount)
return FALSE
/mob/living/silicon/pai/adjustStaminaLoss(amount)
take_holo_damage(amount/4)
/mob/living/silicon/pai/adjustBrainLoss(amount)
fullstun(amount/10)
/mob/living/silicon/pai/getBruteLoss()
return emittermaxhealth - emitterhealth
/mob/living/silicon/pai/getFireLoss()
return emittermaxhealth - emitterhealth
/mob/living/silicon/pai/getToxLoss()
return FALSE
/mob/living/silicon/pai/getOxyLoss()
return FALSE
/mob/living/silicon/pai/getCloneLoss()
return FALSE
/mob/living/silicon/pai/getBrainLoss()
return FALSE
/mob/living/silicon/pai/getStaminaLoss()
return FALSE
/mob/living/silicon/pai/setCloneLoss()
return FALSE
/mob/living/silicon/pai/setBrainLoss()
return FALSE
/mob/living/silicon/pai/setStaminaLoss()
return FALSE
/mob/living/silicon/pai/setToxLoss()
return FALSE
/mob/living/silicon/pai/setOxyLoss()
return FALSE
@@ -0,0 +1,102 @@
/mob/living/silicon/pai/proc/fold_out(force = FALSE)
if(emitterhealth < 0)
src << "<span class='warning'>Your holochassis emitters are still too unstable! Please wait for automatic repair.</span>"
return FALSE
if(!canholo && !force)
src << "<span class='warning'>Your master or another force has disabled your holochassis emitters!</span>"
return FALSE
if(holoform)
. = fold_in(force)
return
if(emittersemicd)
src << "<span class='warning'>Error: Holochassis emitters recycling. Please try again later.</span>"
return FALSE
emittersemicd = TRUE
addtimer(src, "emittercool", emittercd)
canmove = TRUE
density = TRUE
if(istype(card.loc, /obj/item/device/pda))
var/obj/item/device/pda/P = card.loc
P.pai = null
P.visible_message("<span class='notice'>[src] ejects itself from [P]!</span>")
if(istype(card.loc, /mob/living))
var/mob/living/L = card.loc
if(!L.unEquip(card))
src << "<span class='warning'>Error: Unable to expand to mobile form. Chassis is restrained by some device or person.</span>"
return FALSE
var/turf/T = get_turf(card)
forceMove(T)
card.forceMove(src)
if(client)
client.perspective = EYE_PERSPECTIVE
client.eye = src
SetLuminosity(0)
icon_state = "[chassis]"
visible_message("<span class='boldnotice'>[src] folds out its holochassis emitter and forms a holoshell around itself!</span>")
holoform = TRUE
/mob/living/silicon/pai/proc/emittercool()
emittersemicd = FALSE
/mob/living/silicon/pai/proc/fold_in(force = FALSE)
emittersemicd = TRUE
if(!force)
addtimer(src, "emittercool", emittercd)
else
addtimer(src, "emittercool", emitteroverloadcd)
icon_state = "[chassis]"
if(!holoform)
. = fold_out(force)
return
visible_message("<span class='notice'>[src] deactivates its holochassis emitter and folds back into a compact card!</span>")
stop_pulling()
if(client)
client.perspective = EYE_PERSPECTIVE
client.eye = card
var/turf/T = get_turf(src)
card.forceMove(T)
forceMove(card)
canmove = FALSE
density = FALSE
SetLuminosity(0)
holoform = FALSE
if(resting)
lay_down()
/mob/living/silicon/pai/proc/choose_chassis()
var/choice = input(src, "What would you like to use for your holochassis composite?") as null|anything in possible_chassis
if(!choice)
return 0
chassis = choice
icon_state = "[chassis]"
if(resting)
icon_state = "[chassis]_rest"
src << "<span class='boldnotice'>You switch your holochassis projection composite to [chassis]</span>"
/mob/living/silicon/pai/lay_down()
..()
update_resting_icon(resting)
/mob/living/silicon/pai/proc/update_resting_icon(rest)
if(rest)
icon_state = "[chassis]_rest"
else
icon_state = "[chassis]"
if(loc != card)
visible_message("<span class='notice'>[src] [rest? "lays down for a moment..." : "perks up from the ground"]</span>")
/mob/living/silicon/pai/start_pulling(atom/movable/AM)
return FALSE
/mob/living/silicon/pai/proc/toggle_integrated_light()
if(!luminosity)
SetLuminosity(light_power)
src << "<span class='notice'>You enable your integrated light.</span>"
else
SetLuminosity(0)
src << "<span class='notice'>You disable your integrated light.</span>"
+1 -1
View File
@@ -1,5 +1,5 @@
/mob/living/silicon/pai/say(msg)
if(silence_time)
if(silent)
src << "<span class='warning'>Communication circuits remain unitialized.</span>"
else
..(msg)
+17 -17
View File
@@ -125,21 +125,21 @@
switch(soft)
// Purchasing new software
if("buy")
if(src.subscreen == 1)
if(subscreen == 1)
var/target = href_list["buy"]
if(available_software.Find(target))
var/cost = src.available_software[target]
if(src.ram >= cost)
src.ram -= cost
src.software.Add(target)
if(ram >= cost)
ram -= cost
software.Add(target)
else
src.temp = "Insufficient RAM available."
temp = "Insufficient RAM available."
else
src.temp = "Trunk <TT> \"[target]\"</TT> not found."
temp = "Trunk <TT> \"[target]\"</TT> not found."
// Configuring onboard radio
if("radio")
src.card.radio.attack_self(src)
radio.attack_self(src)
if("image")
var/newImage = input("Select your new display image.", "Display Image", "Happy") in list("Happy", "Cat", "Extremely Happy", "Face", "Laugh", "Off", "Sad", "Angry", "What")
@@ -166,7 +166,7 @@
pID = 9
if("Null")
pID = 10
src.card.setEmotion(pID)
card.setEmotion(pID)
if("signaller")
@@ -195,7 +195,7 @@
if(href_list["getdna"])
var/mob/living/M = card.loc
var/count = 0
while(!istype(M, /mob/living))
while(!isliving(M))
if(!M || !M.loc) return 0 //For a runtime where M ends up in nullspace (similar to bluespace but less colourful)
M = M.loc
count++
@@ -211,7 +211,7 @@
else if(href_list["ringer"])
pda.silent = !pda.silent
else if(href_list["target"])
if(silence_time)
if(silent)
return alert("Communications circuits remain unitialized.")
var/target = locate(href_list["target"])
@@ -265,7 +265,7 @@
src.hackdoor = null
if(href_list["cable"])
var/turf/T = get_turf(src.loc)
src.cable = new /obj/item/weapon/pai_cable(T)
cable = new /obj/item/weapon/pai_cable(T)
T.visible_message("<span class='warning'>A port on [src] opens to reveal [src.cable], which promptly falls to the floor.</span>", "<span class='italics'>You hear the soft click of something light and hard falling to the ground.</span>")
//src.updateUsrDialog() We only need to account for the single mob this is intended for, and he will *always* be able to call this window
src.paiInterface() // So we'll just call the update directly rather than doing some default checks
@@ -356,7 +356,7 @@
dat += "<b>Prime Directive</b><br>"
dat += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[src.laws.zeroth]<br>"
dat += "<b>Supplemental Directives</b><br>"
for(var/slaws in src.laws.supplied)
for(var/slaws in laws.supplied)
dat += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[slaws]<br>"
dat += "<br>"
dat += {"<i><p>Recall, personality, that you are a complex thinking, sentient being. Unlike station AI models, you are capable of
@@ -372,7 +372,7 @@
/mob/living/silicon/pai/proc/CheckDNA(mob/living/carbon/M, mob/living/silicon/pai/P)
var/answer = input(M, "[P] is requesting a DNA sample from you. Will you allow it to confirm your identity?", "[P] Check DNA", "No") in list("Yes", "No")
if(answer == "Yes")
M.visible_message("<span class='notice'>[M] presses \his thumb against [P].</span>",\
M.visible_message("<span class='notice'>[M] presses [M.p_their()] thumb against [P].</span>",\
"<span class='notice'>You press your thumb against [P].</span>",\
"<span class='notice'>[P] makes a sharp clicking sound as it extracts DNA material from [M].</span>")
if(!M.has_dna())
@@ -384,7 +384,7 @@
else
P << "<b>DNA does not match stored Master DNA.</b>"
else
P << "[M] does not seem like \he is going to provide a DNA sample willingly."
P << "[M] does not seem like [M.p_they()] [M.p_are()] going to provide a DNA sample willingly."
// -=-=-=-= Software =-=-=-=-=- //
@@ -497,9 +497,9 @@
<h4>Host Bioscan</h4><br>
"}
var/mob/living/M = card.loc
if(!istype(M, /mob/living))
while (!istype(M, /mob/living))
if(istype(M, /turf))
if(!isliving(M))
while(!isliving(M))
if(isturf(M))
src.temp = "Error: No biological host found. <br>"
src.subscreen = 0
return dat