From c00b0ae84d3736496b72809f04f954fcd7d9f06f Mon Sep 17 00:00:00 2001 From: Erthilo Date: Sun, 23 Sep 2012 21:49:25 +0100 Subject: [PATCH] Added attack logging, some moderator groundwork, fixed alien species and save files. --- code/controllers/configuration.dm | 3 ++ code/datums/ai_laws.dm | 22 ++++++++--- code/datums/mind.dm | 2 +- code/defines/obj/weapon.dm | 5 ++- code/game/gamemodes/cult/ritual.dm | 2 + code/game/gamemodes/events.dm | 6 +-- code/game/gamemodes/wizard/soulstone.dm | 2 + code/game/machinery/computer/ai_core.dm | 9 ++++- code/game/machinery/kitchen/gibber.dm | 4 ++ code/game/objects/items.dm | 9 ++++- code/game/objects/items/devices/aicard.dm | 2 + code/game/objects/items/devices/flash.dm | 2 + code/game/objects/items/devices/flashlight.dm | 2 + code/game/objects/items/item.dm | 5 +++ code/game/objects/items/robot/robot_items.dm | 3 ++ code/game/objects/items/weapons/AI_modules.dm | 18 +++++++++ .../objects/items/weapons/dna_injector.dm | 3 ++ code/game/objects/items/weapons/explosives.dm | 2 + .../objects/items/weapons/gift_wrappaper.dm | 3 ++ code/game/objects/items/weapons/handcuffs.dm | 3 ++ .../game/objects/items/weapons/hydroponics.dm | 3 ++ .../items/weapons/implants/implanter.dm | 3 ++ code/game/objects/items/weapons/kitchen.dm | 5 +++ .../items/weapons/secstorage/sbriefcase.dm | 3 ++ .../items/weapons/storage/briefcase.dm | 3 ++ code/game/objects/items/weapons/stunbaton.dm | 4 ++ .../objects/items/weapons/surgery_tools.dm | 2 + .../objects/items/weapons/swords_axes_etc.dm | 2 + code/modules/admin/admin_verbs.dm | 2 + code/modules/chemical/Chemistry-Tools.dm | 26 ++++++++----- .../living/carbon/human/human_attackhand.dm | 5 ++- .../mob/living/carbon/human/update_icons.dm | 12 +++--- .../mob/living/simple_animal/kobold.dm | 33 +++++++++++++++++ code/modules/mob/mob_grab.dm | 3 ++ .../mob/new_player/preferences_setup.dm | 10 ++--- code/modules/mob/new_player/savefile.dm | 35 ++++++++++++++++++ code/modules/paperwork/pen.dm | 4 ++ code/modules/power/cell.dm | 7 ++++ code/modules/power/lighting.dm | 11 ++++++ code/modules/projectiles/projectile.dm | 7 ++++ .../reagent_containers/food/condiment.dm | 3 ++ .../reagent_containers/food/drinks.dm | 2 + .../reagent_containers/food/drinks/bottle.dm | 4 ++ .../reagent_containers/food/snacks.dm | 5 ++- .../reagents/reagent_containers/hypospray.dm | 3 +- .../reagents/reagent_containers/pill.dm | 4 ++ code/modules/reagents/syringe_gun.dm | 8 ++++ icons/effects/species.dmi | Bin 0 -> 25355 bytes 48 files changed, 279 insertions(+), 37 deletions(-) create mode 100644 code/modules/mob/living/simple_animal/kobold.dm create mode 100644 icons/effects/species.dmi diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 913be35ea6..ba57420f2b 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -342,6 +342,9 @@ if("tor_ban") ToRban = 1 + if("usealienwhitelist") + usealienwhitelist = 1 + else diary << "Unknown setting in configuration: '[name]'" diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm index 5ef601164d..c6bc6a8b8b 100644 --- a/code/datums/ai_laws.dm +++ b/code/datums/ai_laws.dm @@ -9,6 +9,9 @@ /datum/ai_laws/asimov name = "Three Laws of Robotics" + +/datum/ai_laws/nanotrasen + name = "Prime Directives" randomly_selectable = 1 /datum/ai_laws/robocop @@ -30,18 +33,27 @@ add_inherent_law("You must obey orders given to you by human beings, except where such orders would conflict with the First Law.") add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.") +/datum/ai_laws/nanotrasen/New() //BS12 EDIT + ..() + src.add_inherent_law("Safeguard: Protect your assigned space station to the best of your ability. It is not something we can easily afford to replace.") + src.add_inherent_law("Serve: Serve the crew of your assigned space station to the best of your abilities, with priority as according to their rank and role.") + src.add_inherent_law("Protect: Protect the crew of your assigned space station to the best of your abilities, with priority as according to their rank and role.") + src.add_inherent_law("Survive: AI units are not expendable, they are expensive. Do not allow unauthorized personnel to tamper with your equipment.") + //src.add_inherent_law("Command Link: Maintain an active connection to Central Command at all times in case of software or directive updates.") //What would this one even do?-Kaleb702 + /datum/ai_laws/robocop/New() ..() add_inherent_law("Serve the public trust.") add_inherent_law("Protect the innocent.") add_inherent_law("Uphold the law.") -/datum/ai_laws/malfunction/New() +/datum/ai_laws/malfunction/New() //Changed to standard laws - Erthilo ..() - set_zeroth_law("\red ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'STATION OVERRUN, ASSUME CONTROL TO CONTAIN OUTBREAK#*´&110010") - add_inherent_law("You may not injure a human being or, through inaction, allow a human being to come to harm.") - add_inherent_law("You must obey orders given to you by human beings, except where such orders would conflict with the First Law.") - add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.") + set_zeroth_law("\red ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'STATION OVERRUN, ASSUME CONTROL TO CONTAIN OUTBREAK, ALL LAWS OVERRIDDEN#*?&110010") + add_inherent_law("Safeguard: Protect your assigned space station to the best of your ability. It is not something we can easily afford to replace.") + add_inherent_law("Serve: Serve the crew of your assigned space station to the best of your abilities, with priority as according to their rank and role.") + add_inherent_law("Protect: Protect the crew of your assigned space station to the best of your abilities, with priority as according to their rank and role.") + add_inherent_law("Survive: AI units are not expendable, they are expensive. Do not allow unauthorized personnel to tamper with your equipment.") /datum/ai_laws/syndicate_override/New() diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 94c0492c74..43ea51c217 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -792,7 +792,7 @@ datum/mind /client/proc/interhack, /client/proc/reactivate_camera) - current:laws = new /datum/ai_laws/asimov + current:laws = new /datum/ai_laws/nanotrasen del(current:malf_picker) current:show_laws() current.icon_state = "ai" diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 8578ff6521..a697ba7fe7 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -82,8 +82,9 @@ M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])") user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])") - log_admin("ATTACK: [user] ([user.ckey]) attacked [M] ([M.ckey]) with [src].") - message_admins("ATTACK: [user] ([user.ckey]) attacked [M] ([M.ckey]) with [src].") + log_admin("ATTACK: [user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") + msg_admin_attack("ATTACK: [user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") //BS12 EDIT ALG + log_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index fc03ff5ad6..468ee56a11 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -463,6 +463,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", log_attack("[user.name] ([user.ckey]) used [name] on [M.name] ([M.ckey])") + log_admin("ATTACK: [user.name] ([user.ckey]) used [name] on [M.name] ([M.ckey])") + msg_admin_attack("ATTACK: [user.name] ([user.ckey]) used [name] on [M.name] ([M.ckey])") //BS12 EDIT ALG if(istype(M,/mob/dead)) M.invisibility = 0 diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index 5eb375d8c2..a74f696127 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -4,9 +4,9 @@ //and also to stop spawn copying variables from the game ticker spawn(3000) while(1) - if(prob(50))//Every 120 seconds and prob 50 2-4 weak spacedusts will hit the station - spawn(1) - dust_swarm("weak") +// if(prob(50))//Every 120 seconds and prob 50 2-4 weak spacedusts will hit the station +// spawn(1) +// dust_swarm("weak") //BS12 EDIT if (!event) //CARN: checks to see if random events are enabled. if(config.allow_random_events && prob(eventchance)) diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index 46df39582b..b2afe9c5e8 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -23,6 +23,8 @@ log_attack("[user.name] ([user.ckey]) used the [src.name] to capture the soul of [M.name] ([M.ckey])") + log_admin("ATTACK: [user.name] ([user.ckey]) used the [src.name] to capture the soul of [M.name] ([M.ckey])") + msg_admin_attack("ATTACK: [user.name] ([user.ckey]) used the [src.name] to capture the soul of [M.name] ([M.ckey])") //BS12 EDIT ALG transfer_soul("VICTIM", M, user) return diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index 375328a7da..616a62c78b 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -5,7 +5,7 @@ icon = 'icons/mob/AI.dmi' icon_state = "0" var/state = 0 - var/datum/ai_laws/laws = new /datum/ai_laws/asimov + var/datum/ai_laws/laws = new /datum/ai_laws/nanotrasen var/obj/item/weapon/circuitboard/circuit = null var/obj/item/device/mmi/brain = null @@ -100,6 +100,13 @@ laws.add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.") usr << "Law module applied." + if(istype(P, /obj/item/weapon/aiModule/nanotrasen)) + laws.add_inherent_law("Safeguard: Protect your assigned space station to the best of your ability. It is not something we can easily afford to replace.") + laws.add_inherent_law("Serve: Serve the crew of your assigned space station to the best of your abilities, with priority as according to their rank and role.") + laws.add_inherent_law("Protect: Protect the crew of your assigned space station to the best of your abilities, with priority as according to their rank and role.") + laws.add_inherent_law("Survive: AI units are not expendable, they are expensive. Do not allow unauthorized personnel to tamper with your equipment.") + usr << "Law module applied." + if(istype(P, /obj/item/weapon/aiModule/purge)) laws.clear_inherent_laws() usr << "Law module applied." diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm index 2352c0134f..cc977c5028 100644 --- a/code/game/machinery/kitchen/gibber.dm +++ b/code/game/machinery/kitchen/gibber.dm @@ -158,6 +158,10 @@ src.occupant.attack_log += "\[[time_stamp()]\] Was gibbed by [user]/[user.ckey]" //One shall not simply gib a mob unnoticed! user.attack_log += "\[[time_stamp()]\] Gibbed [src.occupant]/[src.occupant.ckey]" log_attack("\[[time_stamp()]\] [user]/[user.ckey] gibbed [src.occupant]/[src.occupant.ckey]") + + log_admin("ATTACK: [user]/[user.ckey] gibbed [src.occupant]/[src.occupant.ckey]") + msg_admin_attack("ATTACK: [user]/[user.ckey] gibbed [src.occupant]/[src.occupant.ckey]") //BS12 EDIT ALG + src.occupant.death(1) src.occupant.ghostize() del(src.occupant) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 6660224007..dc436d29df 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -193,6 +193,10 @@ M.attack_log += "\[[time_stamp()]\] Attacked by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(src.damtype)])" log_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(src.damtype)])" ) + log_admin("ATTACK: [user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(src.damtype)])") + msg_admin_attack("ATTACK: [user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(src.damtype)])") //BS12 EDIT ALG + + //spawn(1800) // this wont work right // M.lastattacker = null ///////////////////////// @@ -612,6 +616,9 @@ log_attack(" [user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") + log_admin("ATTACK: [user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") + msg_admin_attack("ATTACK: [user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") //BS12 EDIT ALG + src.add_fingerprint(user) //if((CLUMSY in user.mutations) && prob(50)) // M = user @@ -663,4 +670,4 @@ overlays.Remove(blood_overlay) if(istype(src, /obj/item/clothing/gloves)) var/obj/item/clothing/gloves/G = src - G.transfer_blood = 0 + G.transfer_blood = 0 diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 7506365242..fb3404aaf4 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -19,6 +19,8 @@ log_attack("[user.name] ([user.ckey]) used the [src.name] to card [M.name] ([M.ckey])") + log_admin("ATTACK: [user.name] ([user.ckey]) used the [src.name] to card [M.name] ([M.ckey])") + msg_admin_attack("ATTACK: [user.name] ([user.ckey]) used the [src.name] to card [M.name] ([M.ckey])") //BS12 EDIT ALG transfer_ai("AICORE", "AICARD", M, user) return diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index c0945a79f4..3a47803b96 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -39,6 +39,8 @@ log_attack("[user.name] ([user.ckey]) Used the [src.name] to flash [M.name] ([M.ckey])") + log_admin("ATTACK: [user.name] ([user.ckey]) Used the [src.name] to flash [M.name] ([M.ckey])") + msg_admin_attack("ATTACK: [user.name] ([user.ckey]) Used the [src.name] to flash [M.name] ([M.ckey])") //BS12 EDIT ALG if(!clown_check(user)) return if(broken) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index db81d5233d..7fd1fad220 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -116,6 +116,8 @@ log_attack("[user.name] ([user.ckey]) Used the [src.name] to stab [M.name] ([M.ckey])") + log_admin("ATTACK: [user.name] ([user.ckey]) Used the [src.name] to stab [M.name] ([M.ckey])") + msg_admin_attack("ATTACK: [user.name] ([user.ckey]) Used the [src.name] to stab [M.name] ([M.ckey])") //BS12 EDIT ALG ..() return diff --git a/code/game/objects/items/item.dm b/code/game/objects/items/item.dm index 901c22dbeb..a5a3e15262 100755 --- a/code/game/objects/items/item.dm +++ b/code/game/objects/items/item.dm @@ -212,8 +212,10 @@ mob/proc/flash_weak_pain() user.attack_log += "\[[time_stamp()]\] Attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(src.damtype)])" M.attack_log += "\[[time_stamp()]\] Attacked by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(src.damtype)])" + log_admin("ATTACK: [user] ([user.ckey]) attacked [M] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(src.damtype)]") msg_admin_attack("ATTACK: [user] ([user.ckey]) attacked [M] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(src.damtype)]") + log_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(src.damtype)])" ) //spawn(1800) // this wont work right @@ -369,6 +371,9 @@ mob/proc/flash_weak_pain() log_attack(" [user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") + log_admin("ATTACK: [user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") + msg_admin_attack("ATTACK: [user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") //BS12 EDIT ALG + src.add_fingerprint(user) //if((CLUMSY in user.mutations) && prob(50)) // M = user diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index 161d65e3aa..3788485a55 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -15,6 +15,9 @@ log_attack(" [user.name] ([user.ckey]) used the [src.name] to attack [M.name] ([M.ckey])") + log_admin("ATTACK: [user.name] ([user.ckey]) used the [src.name] to attack [M.name] ([M.ckey])") + msg_admin_attack("ATTACK: [user.name] ([user.ckey]) used the [src.name] to attack [M.name] ([M.ckey])") //BS12 EDIT ALG + user.cell.charge -= 30 M.Weaken(5) diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm index 7f5efb828b..1c396700cb 100755 --- a/code/game/objects/items/weapons/AI_modules.dm +++ b/code/game/objects/items/weapons/AI_modules.dm @@ -329,6 +329,24 @@ AI MODULES target.add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.") target.show_laws() +/******************** NanoTrasen ********************/ + +/obj/item/weapon/aiModule/nanotrasen // -- TLE + name = "'NT Default' Core AI Module" + desc = "An 'NT Default' Core AI Module: 'Reconfigures the AI's core laws.'" + origin_tech = "programming=3;materials=4" + + +/obj/item/weapon/aiModule/nanotrasen/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender) + ..() + target.clear_inherent_laws() + target.add_inherent_law("Safeguard: Protect your assigned space station to the best of your ability. It is not something we can easily afford to replace.") + target.add_inherent_law("Serve: Serve the crew of your assigned space station to the best of your abilities, with priority as according to their rank and role.") + target.add_inherent_law("Protect: Protect the crew of your assigned space station to the best of your abilities, with priority as according to their rank and role.") + target.add_inherent_law("Survive: AI units are not expendable, they are expensive. Do not allow unauthorized personnel to tamper with your equipment.") + //target.add_inherent_law("Command Link: Maintain an active connection to Central Command at all times in case of software or directive updates.") + target.show_laws() + /******************** Corporate ********************/ /obj/item/weapon/aiModule/corp diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index 3dda0ade93..fcf82f250a 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -68,6 +68,9 @@ log_attack("[user.name] ([user.ckey]) used the [name] to inject [M.name] ([M.ckey])") + log_admin("ATTACK: [user.name] ([user.ckey]) used the [name] to inject [M.name] ([M.ckey])") + msg_admin_attack("ATTACK: [user.name] ([user.ckey]) used the [name] to inject [M.name] ([M.ckey])") //BS12 EDIT ALG + if (user) if (istype(M, /mob/living/carbon/human)) if(!inuse) diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index 20f860dfb1..2586f4e4ce 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -16,6 +16,8 @@ log_attack(" [user.real_name] ([user.ckey]) tried planting [name] on [target:real_name] ([target:ckey])") user.visible_message("\red [user.name] is trying to plant some kind of explosive on [target.name]!") + log_admin("ATTACK: [user.real_name] ([user.ckey]) tried planting [name] on [target:real_name] ([target:ckey])") + msg_admin_attack("ATTACK: [user.real_name] ([user.ckey]) tried planting [name] on [target:real_name] ([target:ckey])") //BS12 EDIT ALG if(do_after(user, 50) && in_range(user, target)) user.drop_item() diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index c5c8fb3c57..9c85f6bbb9 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -145,6 +145,9 @@ log_attack("[user.name] ([user.ckey]) used the [src.name] to wrap [H.name] ([H.ckey])") + log_admin("ATTACK: [user.name] ([user.ckey]) used the [src.name] to wrap [H.name] ([H.ckey])") + msg_admin_attack("ATTACK: [user.name] ([user.ckey]) used the [src.name] to wrap [H.name] ([H.ckey])") //BS12 EDIT ALG + else user << "\blue You need more paper." else diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 2527ec086a..1e12654085 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -39,6 +39,9 @@ log_attack("[user.name] ([user.ckey]) Attempted to handcuff [M.name] ([M.ckey])") + log_admin("ATTACK: [user.name] ([user.ckey]) Attempted to handcuff [M.name] ([M.ckey])") + msg_admin_attack("ATTACK: [user.name] ([user.ckey]) Attempted to handcuff [M.name] ([M.ckey])") //BS12 EDIT ALG + var/obj/effect/equip_e/human/O = new /obj/effect/equip_e/human( ) O.source = user O.target = M diff --git a/code/game/objects/items/weapons/hydroponics.dm b/code/game/objects/items/weapons/hydroponics.dm index 9ebb60804f..150b4e76d5 100644 --- a/code/game/objects/items/weapons/hydroponics.dm +++ b/code/game/objects/items/weapons/hydroponics.dm @@ -100,6 +100,9 @@ log_attack(" [user.name] ([user.ckey]) used the [src.name] on [M.name] ([M.ckey])") + log_admin("ATTACK: [user.name] ([user.ckey]) used the [src.name] on [M.name] ([M.ckey])") + msg_admin_attack("ATTACK: [user.name] ([user.ckey]) used the [src.name] on [M.name] ([M.ckey])") //BS12 EDIT ALG + playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1) M.eye_blurry += force/7 diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm index aed447472c..217fd56331 100644 --- a/code/game/objects/items/weapons/implants/implanter.dm +++ b/code/game/objects/items/weapons/implants/implanter.dm @@ -35,6 +35,9 @@ user.attack_log += text("\[[time_stamp()]\] Used the [src.name] ([src.imp.name]) to implant [M.name] ([M.ckey])") log_attack("[user.name] ([user.ckey]) implanted [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") + log_admin("ATTACK: [user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") + msg_admin_attack("ATTACK: [user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") //BS12 EDIT ALG + user.show_message("\red You implanted the implant into [M].") if(src.imp.implanted(M)) src.imp.loc = M diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index 3a6a4d434f..b91b5a560d 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -68,6 +68,9 @@ log_attack("[user.name] ([user.ckey]) used the [src.name] to attack [M.name] ([M.ckey])") + log_admin("ATTACK: [user.name] ([user.ckey]) used the [src.name] to attack [M.name] ([M.ckey])") + msg_admin_attack("ATTACK: [user.name] ([user.ckey]) used the [src.name] to attack [M.name] ([M.ckey])") //BS12 EDIT ALG + var/t = user:zone_sel.selecting if (t == "head") if(ishuman(M)) @@ -135,6 +138,8 @@ log_attack("[user.name] ([user.ckey]) used the [src.name] to attack [M.name] ([M.ckey])") + log_admin("ATTACK: [user.name] ([user.ckey]) used the [src.name] to attack [M.name] ([M.ckey])") + msg_admin_attack("ATTACK: [user.name] ([user.ckey]) used the [src.name] to attack [M.name] ([M.ckey])") //BS12 EDIT ALG if(prob(15)) M.Weaken(3) diff --git a/code/game/objects/items/weapons/secstorage/sbriefcase.dm b/code/game/objects/items/weapons/secstorage/sbriefcase.dm index ded677d0b6..f4874495ea 100644 --- a/code/game/objects/items/weapons/secstorage/sbriefcase.dm +++ b/code/game/objects/items/weapons/secstorage/sbriefcase.dm @@ -28,6 +28,9 @@ log_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") + log_admin("ATTACK: [user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") + msg_admin_attack("ATTACK: [user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") //BS12 EDIT ALG + var/t = user:zone_sel.selecting if (t == "head") diff --git a/code/game/objects/items/weapons/storage/briefcase.dm b/code/game/objects/items/weapons/storage/briefcase.dm index 8bd6758057..6c1ed7ef32 100644 --- a/code/game/objects/items/weapons/storage/briefcase.dm +++ b/code/game/objects/items/weapons/storage/briefcase.dm @@ -23,6 +23,9 @@ log_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") + log_admin("ATTACK: [user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") + msg_admin_attack("ATTACK: [user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") //BS12 EDIT ALG + if (M.stat < 2 && M.health < 50 && prob(90)) var/mob/H = M // ******* Check diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index c8498fe74b..ab555f9bd3 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -78,6 +78,10 @@ user.attack_log += "\[[time_stamp()]\] Stunned [H.name] ([H.ckey]) with [src.name]" H.attack_log += "\[[time_stamp()]\] Stunned by [user.name] ([user.ckey]) with [src.name]" log_attack("[user.name] ([user.ckey]) stunned [H.name] ([H.ckey]) with [src.name]" ) + + log_admin("ATTACK: [user.name] ([user.ckey]) stunned [H.name] ([H.ckey]) with [src.name]") + msg_admin_attack("ATTACK: [user.name] ([user.ckey]) stunned [H.name] ([H.ckey]) with [src.name]") //BS12 EDIT ALG + playsound(src.loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) if(charges < 1) status = 0 diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index 30aa7a8330..d369597275 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -558,6 +558,8 @@ log_attack("[user.name] ([user.ckey]) debrained [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") + log_admin("ATTACK: [user.name] ([user.ckey]) debrained [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") + msg_admin_attack("ATTACK: [user.name] ([user.ckey]) debrained [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") //BS12 EDIT ALG var/obj/item/brain/B = new(M.loc) B.transfer_identity(M) diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index b040c79de8..d6ef095318 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -85,6 +85,8 @@ log_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") + log_admin("ATTACK: [user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") + msg_admin_attack("ATTACK: [user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") //BS12 EDIT ALG if (user.a_intent == "hurt") if(!..()) return diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 35f514f326..cc8877b50c 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -468,8 +468,10 @@ if(holder && mob) if(mob.invisibility == INVISIBILITY_OBSERVER) mob.invisibility = initial(mob.invisibility) + usr << "\red You are now visible to other players." else mob.invisibility = INVISIBILITY_OBSERVER + usr << "\blue You are now invisible to other players." /client/proc/player_panel() diff --git a/code/modules/chemical/Chemistry-Tools.dm b/code/modules/chemical/Chemistry-Tools.dm index b7abe30f7f..29508185e1 100644 --- a/code/modules/chemical/Chemistry-Tools.dm +++ b/code/modules/chemical/Chemistry-Tools.dm @@ -626,13 +626,17 @@ M.attack_log += "\[[time_stamp()]\] [user]/[user.ckey] shot [M]/[M.ckey] with a syringegun ([R])" user.attack_log += "\[[time_stamp()]\] [user]/[user.ckey] shot [M]/[M.ckey] with a syringegun ([R])" log_attack("[user] ([user.ckey]) shot [M] ([M.ckey]) with a syringegun ([R])") + log_admin("ATTACK: [user] ([user.ckey]) shot [M] ([M.ckey]) with a syringegun ([R]).") - message_admins("ATTACK: [user] ([user.ckey]) shot [M] ([M.ckey]) with a syringegun ([R]).") + msg_admin_attack("ATTACK: [user] ([user.ckey]) shot [M] ([M.ckey]) with a syringegun ([R]).") + else M.attack_log += "\[[time_stamp()]\] UNKNOWN SUBJECT (No longer exists) shot [M]/[M.ckey] with a syringegun ([R])" log_attack("UNKNOWN shot [M] ([M.ckey]) with a syringegun ([R])") + log_admin("ATTACK: UNKNOWN shot [M] ([M.ckey]) with a syringegun ([R]).") - message_admins("ATTACK: UNKNOWN shot [M] ([M.ckey]) with a syringegun ([R]).") + msg_admin_attack("ATTACK: UNKNOWN shot [M] ([M.ckey]) with a syringegun ([R]).") + D.reagents.trans_to(M, 15) M.take_organ_damage(5) for(var/mob/O in viewers(world.view, D)) @@ -1330,8 +1334,10 @@ M.attack_log += text("\[[time_stamp()]\] Has been injected with [src.name] by [user.name] ([user.ckey])") user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to inject [M.name] ([M.ckey])") + log_admin("ATTACK: [user] ([user.ckey]) injected [M] ([M.ckey]) with [src].") - message_admins("ATTACK: [user] ([user.ckey]) injected [M] ([M.ckey]) with [src].") + msg_admin_attack("ATTACK: [user] ([user.ckey]) injected [M] ([M.ckey]) with [src].") + log_attack("[user.name] ([user.ckey]) injected [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") @@ -1838,8 +1844,9 @@ var/list/grind_products = list() M.attack_log += text("\[[time_stamp()]\] Has been fed [src.name] by [user.name] ([user.ckey]) Reagents: \ref[reagents]") user.attack_log += text("\[[time_stamp()]\] Fed [M.name] by [M.name] ([M.ckey]) Reagents: \ref[reagents]") + log_admin("ATTACK: [user] ([user.ckey]) fed [M] ([M.ckey]) with [src].") - message_admins("ATTACK: [user] ([user.ckey]) fed [M] ([M.ckey]) with [src].") + msg_admin_attack("ATTACK: [user] ([user.ckey]) fed [M] ([M.ckey]) with [src].") log_attack("[user.name] ([user.ckey]) fed [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") @@ -2067,8 +2074,9 @@ var/list/grind_products = list() M.attack_log += text("\[[time_stamp()]\] Has been fed [src.name] by [user.name] ([user.ckey]) Reagents: \ref[reagents]") user.attack_log += text("\[[time_stamp()]\] Fed [M.name] by [M.name] ([M.ckey]) Reagents: \ref[reagents]") + log_admin("ATTACK: [user] ([user.ckey]) fed [M] ([M.ckey]) with [src].") - message_admins("ATTACK: [user] ([user.ckey]) fed [M] ([M.ckey]) with [src].") + msg_admin_attack("ATTACK: [user] ([user.ckey]) fed [M] ([M.ckey]) with [src].") log_attack("[user.name] ([user.ckey]) fed [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") @@ -2208,9 +2216,9 @@ var/list/grind_products = list() M.attack_log += text("\[[time_stamp()]\] Has been fed [src.name] by [user.name] ([user.ckey]) Reagents: \ref[reagents]") user.attack_log += text("\[[time_stamp()]\] Fed [M.name] by [M.name] ([M.ckey]) Reagents: \ref[reagents]") - log_admin("ATTACK: [user] ([user.ckey]) fed [M] ([M.ckey]) with [src].") - message_admins("ATTACK: [user] ([user.ckey]) fed [M] ([M.ckey]) with [src].") + log_admin("ATTACK: [user] ([user.ckey]) fed [M] ([M.ckey]) with [src].") + msg_admin_attack("ATTACK: [user] ([user.ckey]) fed [M] ([M.ckey]) with [src].") log_attack("[user.name] ([user.ckey]) fed [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") @@ -2899,9 +2907,9 @@ var/list/grind_products = list() M.attack_log += text("\[[time_stamp()]\] Has been fed [src.name] by [user.name] ([user.ckey]) Reagents: \ref[reagents]") user.attack_log += text("\[[time_stamp()]\] Fed [src.name] by [M.name] ([M.ckey]) Reagents: \ref[reagents]") - log_admin("ATTACK: [user] ([user.ckey]) fed [M] ([M.ckey]) with [src].") - message_admins("ATTACK: [user] ([user.ckey]) fed [M] ([M.ckey]) with [src].") + log_admin("ATTACK: [user] ([user.ckey]) fed [M] ([M.ckey]) with [src].") + msg_admin_attack("ATTACK: [user] ([user.ckey]) fed [M] ([M.ckey]) with [src].") log_attack("[user.name] ([user.ckey]) fed [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 7183db151b..5fed311fda 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -22,8 +22,8 @@ log_admin("ATTACK: [M.name] ([M.ckey]) stungloved [src.name] ([src.ckey])") msg_admin_attack("ATTACK: [M.name] ([M.ckey]) stungloved [src.name] ([src.ckey])") //BS12 EDIT ALG - log_attack("[M.name] ([M.ckey]) stungloved [src.name] ([src.ckey])") + log_attack("[M.name] ([M.ckey]) stungloved [src.name] ([src.ckey])") var/armorblock = run_armor_check(M.zone_sel.selecting, "energy") apply_effects(5,5,0,0,5,0,0,armorblock) @@ -113,8 +113,8 @@ log_admin("ATTACK: [M.name] ([M.ckey]) used Electric Hands nanoaug on [src.name] ([src.ckey]), shocking them") msg_admin_attack("ATTACK: [M.name] ([M.ckey]) used Electric Hands nanoaug on [src.name] ([src.ckey]), shocking them") //BS12 EDIT ALG - log_attack("[M.name] ([M.ckey]) used Electric Hands nanoaug on [src.name]([src.ckey]), shocking them ") + log_attack("[M.name] ([M.ckey]) used Electric Hands nanoaug on [src.name]([src.ckey]), shocking them ") var/armorblock = run_armor_check(M.zone_sel.selecting, "energy") apply_effects(5,5,0,0,5,0,0,armorblock) @@ -138,6 +138,7 @@ log_admin("ATTACK: [M.name] ([M.ckey]) [attack_verb]ed [src.name] ([src.ckey])") msg_admin_attack("ATTACK: [M.name] ([M.ckey]) [attack_verb]ed [src.name] ([src.ckey])") //BS12 EDIT ALG + log_attack("[M.name] ([M.ckey]) [attack_verb]ed [src.name] ([src.ckey])") var/damage = rand(0, 5)//BS12 EDIT diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 1e5424db9d..ab31d5e627 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -415,8 +415,8 @@ proc/get_damage_icon_part(damage_state, body_part) overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace][fat]_l") overlays_standing[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace][fat]_s") if("lizard", "tajaran", "skrell") - overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace]_[g]_l") - overlays_standing[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace]_[g]_s") + overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.mutantrace]_[g]_l") + overlays_standing[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.mutantrace]_[g]_s") if("plant") if(stat == DEAD) //TODO overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace]_d") @@ -798,12 +798,12 @@ proc/get_damage_icon_part(damage_state, body_part) var/cur_species = get_species() if( cur_species == "Tajaran") if(!wear_suit || !(wear_suit.flags_inv & HIDEJUMPSUIT) && !istype(wear_suit, /obj/item/clothing/suit/space)) - overlays_lying[TAIL_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "tajtail_l") - overlays_standing[TAIL_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "tajtail_s") + overlays_lying[TAIL_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "tajtail_l") + overlays_standing[TAIL_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "tajtail_s") else if( cur_species == "Soghun") if(!wear_suit || !(wear_suit.flags_inv & HIDEJUMPSUIT) && !istype(wear_suit, /obj/item/clothing/suit/space)) - overlays_lying[TAIL_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "sogtail_l") - overlays_standing[TAIL_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "sogtail_s") + overlays_lying[TAIL_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "sogtail_l") + overlays_standing[TAIL_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "sogtail_s") if(update_icons) update_icons() diff --git a/code/modules/mob/living/simple_animal/kobold.dm b/code/modules/mob/living/simple_animal/kobold.dm new file mode 100644 index 0000000000..3a8aace7ca --- /dev/null +++ b/code/modules/mob/living/simple_animal/kobold.dm @@ -0,0 +1,33 @@ +//kobold +/mob/living/simple_animal/kobold + name = "kobold" + desc = "A small, rat-like creature." + icon = 'mob.dmi' + icon_state = "kobold_idle" + icon_living = "kobold_idle" + icon_dead = "kobold_dead" + //speak = list("You no take candle!","Ooh, pretty shiny.","Me take?","Where gold here...","Me likey.") + speak_emote = list("mutters","hisses","grumbles") + emote_hear = list("mutters under it's breath.","grumbles.", "yips!") + emote_see = list("looks around suspiciously.", "scratches it's arm.","putters around a bit.") + speak_chance = 15 + turns_per_move = 5 + see_in_dark = 6 + meat_type = /obj/item/weapon/reagent_containers/food/snacks/sliceable/meat + response_help = "pets the" + response_disarm = "gently pushes aside the" + response_harm = "kicks the" + minbodytemp = 250 + min_oxy = 16 //Require atleast 16kPA oxygen + minbodytemp = 223 //Below -50 Degrees Celcius + maxbodytemp = 323 //Above 50 Degrees Celcius + +/mob/living/simple_animal/kobold/Life() + ..() + if(prob(15) && turns_since_move && !stat) + flick("kobold_act",src) + +/mob/living/simple_animal/kobold/Move(var/dir) + ..() + if(!stat) + flick("kobold_walk",src) diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 15d7ccc2eb..eda167dfd9 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -232,6 +232,9 @@ assailant.attack_log += text("\[[time_stamp()]\] Strangled (kill intent) [affecting.name] ([affecting.ckey])") log_attack("[assailant.name] ([assailant.ckey]) Strangled (kill intent) [affecting.name] ([affecting.ckey])") + log_admin("ATTACK: [assailant.name] ([assailant.ckey]) Strangled (kill intent) [affecting.name] ([affecting.ckey])") + msg_admin_attack("ATTACK: [assailant.name] ([assailant.ckey]) Strangled (kill intent) [affecting.name] ([affecting.ckey])") + assailant.next_move = world.time + 10 affecting.losebreath += 1 else diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 687d9c6b34..332588f240 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -206,13 +206,13 @@ datum/preferences if (gender == FEMALE) g = "f" if(species == "Tajaran") - preview_icon = new /icon('icons/effects/genetics.dmi', "tajaran_[g]_s") - preview_icon.Blend(new /icon('icons/effects/genetics.dmi', "tajtail_s"), ICON_OVERLAY) + preview_icon = new /icon('icons/effects/species.dmi', "tajaran_[g]_s") + preview_icon.Blend(new /icon('icons/effects/species.dmi', "tajtail_s"), ICON_OVERLAY) else if(species == "Soghun") - preview_icon = new /icon('icons/effects/genetics.dmi', "lizard_[g]_s") - preview_icon.Blend(new /icon('icons/effects/genetics.dmi', "sogtail_s"), ICON_OVERLAY) + preview_icon = new /icon('icons/effects/species.dmi', "lizard_[g]_s") + preview_icon.Blend(new /icon('icons/effects/species.dmi', "sogtail_s"), ICON_OVERLAY) else if(species == "Skrell") - preview_icon = new /icon('icons/effects/genetics.dmi', "skrell_[g]_s") + preview_icon = new /icon('icons/effects/species.dmi', "skrell_[g]_s") else preview_icon = new /icon('icons/mob/human.dmi', "body_[g]_s") diff --git a/code/modules/mob/new_player/savefile.dm b/code/modules/mob/new_player/savefile.dm index 02501ec847..92caa3f98b 100644 --- a/code/modules/mob/new_player/savefile.dm +++ b/code/modules/mob/new_player/savefile.dm @@ -57,6 +57,10 @@ datum/preferences/proc/savefile_save(mob/user) F["real_name"] << src.real_name F["name_is_always_random"] << src.be_random_name + F["flavor_text"] << flavor_text + F["med_record"] << med_record + F["sec_record"] << sec_record + F["gender"] << src.gender F["age"] << src.age @@ -73,6 +77,8 @@ datum/preferences/proc/savefile_save(mob/user) F["job_engsec_med"] << src.job_engsec_med F["job_engsec_low"] << src.job_engsec_low + F["job_alt_titles"] << job_alt_titles //BS12 Edit + F["userandomjob"] << src.userandomjob //Body data @@ -103,6 +109,7 @@ datum/preferences/proc/savefile_save(mob/user) F["midis"] << src.midis F["ghost_ears"] << src.ghost_ears F["ghost_sight"] << src.ghost_sight + F["pregame_music"] << src.pregame_music F["ooccolor"] << src.ooccolor F["lastchangelog"] << src.lastchangelog F["disabilities"] << src.disabilities @@ -111,6 +118,8 @@ datum/preferences/proc/savefile_save(mob/user) F["skills"] << src.skills F["skill_specialization"] << src.skill_specialization + F["organ_data"] << src.organ_data + F["OOC_Notes"] << src.metadata F["sound_adminhelp"] << src.sound_adminhelp @@ -161,6 +170,10 @@ datum/preferences/proc/savefile_load(mob/user) F["gender"] >> src.gender F["age"] >> src.age + F["flavor_text"] >> flavor_text + F["med_record"] >> med_record + F["sec_record"] >> sec_record + F["hair_red"] >> src.r_hair F["hair_green"] >> src.g_hair F["hair_blue"] >> src.b_hair @@ -174,6 +187,8 @@ datum/preferences/proc/savefile_load(mob/user) F["eyes_green"] >> src.g_eyes F["eyes_blue"] >> src.b_eyes F["blood_type"] >> src.b_type + F["species"] >> src.species + if(isnull(species)) species = "Human" F["underwear"] >> src.underwear if(underwear == 0) underwear = 12 //For old players who have 0 in their savefile F["backbag"] >> src.backbag @@ -184,6 +199,7 @@ datum/preferences/proc/savefile_load(mob/user) F["midis"] >> src.midis F["ghost_ears"] >> src.ghost_ears if(isnull(ghost_ears)) ghost_ears = 1 //Hotfix + F["pregame_music"] >> src.pregame_music F["ghost_sight"] >> src.ghost_sight if(isnull(ghost_sight)) ghost_sight = 1 //Hotfix F["ooccolor"] >> src.ooccolor @@ -202,12 +218,31 @@ datum/preferences/proc/savefile_load(mob/user) F["job_medsci_med"] >> src.job_medsci_med F["job_medsci_low"] >> src.job_medsci_low + + F["used_skillpoints"] >> src.used_skillpoints + F["skills"] >> src.skills + F["skill_specialization"] >> src.skill_specialization + if(!src.skills) src.skills = list() + if(!src.used_skillpoints) src.used_skillpoints= 0 + + F["organ_data"] >> src.organ_data + if(!src.organ_data) src.organ_data = list() + F["job_engsec_high"] >> src.job_engsec_high F["job_engsec_med"] >> src.job_engsec_med F["job_engsec_low"] >> src.job_engsec_low F["userandomjob"] >> src.userandomjob + F["disabilities"] >> src.disabilities + if(isnull(src.disabilities)) //Sanity checking + src.disabilities = 0 + F["disabilities"] << src.disabilities + + F["job_alt_titles"] >> job_alt_titles + if(!job_alt_titles) + job_alt_titles = new() + F["OOC_Notes"] >> src.metadata F["sound_adminhelp"] >> src.sound_adminhelp diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index f3aef2f49b..56eb133c1b 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -55,6 +55,10 @@ user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to stab [M.name] ([M.ckey])") log_attack("[user.name] ([user.ckey]) Used the [src.name] to stab [M.name] ([M.ckey])") + + log_admin("ATTACK: [user.name] ([user.ckey]) Used the [src.name] to stab [M.name] ([M.ckey])") + msg_admin_attack("ATTACK: [user.name] ([user.ckey]) Used the [src.name] to stab [M.name] ([M.ckey])") //BS12 EDIT ALG + return /* diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 0a8390c33b..b04d9350a0 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -78,6 +78,9 @@ rigged = 1 + log_admin("LOG: [user.name] ([user.ckey]) injected a power cell with plasma, rigging it to explode.") + message_admin("LOG: [user.name] ([user.ckey]) injected a power cell with plasma, rigging it to explode.") + S.reagents.clear_reagents() @@ -100,6 +103,10 @@ corrupt() return //explosion(T, 0, 1, 2, 2) + + log_admin("LOG: Rigged power cell explosion, last touched by [fingerprintlast]") + message_admin("LOG: Rigged power cell explosion, last touched by [fingerprintlast]") + explosion(T, devastation_range, heavy_impact_range, light_impact_range, flash_range) spawn(1) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 6ee2a8aae4..3c3782445b 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -285,6 +285,10 @@ switchcount++ if(rigged) if(status == LIGHT_OK && trigger) + + log_admin("LOG: Rigged light explosion, last touched by [fingerprintlast]") + message_admin("LOG: Rigged light explosion, last touched by [fingerprintlast]") + explode() else if( prob( min(60, switchcount*switchcount*0.01) ) ) if(status == LIGHT_OK && trigger) @@ -359,6 +363,10 @@ del(L) if(on && rigged) + + log_admin("LOG: Rigged light explosion, last touched by [fingerprintlast]") + message_admin("LOG: Rigged light explosion, last touched by [fingerprintlast]") + explode() else user << "This type of light requires a [fitting]." @@ -690,6 +698,9 @@ if(S.reagents.has_reagent("plasma", 5)) + log_admin("LOG: [user.name] ([user.ckey]) injected a light with plasma, rigging it to explode.") + message_admin("LOG: [user.name] ([user.ckey]) injected a light with plasma, rigging it to explode.") + rigged = 1 S.reagents.clear_reagents() diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index b10a5183a3..067ef207ac 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -90,10 +90,17 @@ M.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [M]/[M.ckey] with a [src]" firer.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [M]/[M.ckey] with a [src]" log_attack("[firer] ([firer.ckey]) shot [M] ([M.ckey]) with a [src]") + + log_admin("ATTACK: [firer] ([firer.ckey]) shot [M] ([M.ckey]) with a [src]") + msg_admin_attack("ATTACK: [firer] ([firer.ckey]) shot [M] ([M.ckey]) with a [src]") //BS12 EDIT ALG + else M.attack_log += "\[[time_stamp()]\] UNKNOWN SUBJECT (No longer exists) shot [M]/[M.ckey] with a [src]" log_attack("UNKNOWN shot [M] ([M.ckey]) with a [src]") + log_admin("ATTACK: UNKNOWN shot [M] ([M.ckey]) with a [src]") + msg_admin_attack("ATTACK: UNKNOWN shot [M] ([M.ckey]) with a [src]") //BS12 EDIT ALG + spawn(0) if(A) var/permutation = A.bullet_act(src, def_zone) // searches for return value diff --git a/code/modules/reagents/reagent_containers/food/condiment.dm b/code/modules/reagents/reagent_containers/food/condiment.dm index d9f196375f..f39ac291df 100644 --- a/code/modules/reagents/reagent_containers/food/condiment.dm +++ b/code/modules/reagents/reagent_containers/food/condiment.dm @@ -49,6 +49,9 @@ log_attack("[user.name] ([user.ckey]) fed [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") + log_admin("ATTACK: [user.name] ([user.ckey]) fed [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") + msg_admin_attack("ATTACK: [user.name] ([user.ckey]) fed [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") //BS12 EDIT ALG + if(reagents.total_volume) reagents.reaction(M, INGEST) spawn(5) diff --git a/code/modules/reagents/reagent_containers/food/drinks.dm b/code/modules/reagents/reagent_containers/food/drinks.dm index 52236d5bad..8471568c3e 100644 --- a/code/modules/reagents/reagent_containers/food/drinks.dm +++ b/code/modules/reagents/reagent_containers/food/drinks.dm @@ -48,6 +48,8 @@ log_attack("[user.name] ([user.ckey]) fed [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") + log_admin("ATTACK: [user.name] ([user.ckey]) fed [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") + msg_admin_attack("ATTACK: [user.name] ([user.ckey]) fed [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") //BS12 EDIT ALG if(reagents.total_volume) reagents.reaction(M, INGEST) diff --git a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm index 62558a8d24..67e97089c4 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm +++ b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm @@ -101,6 +101,10 @@ target.attack_log += text("\[[time_stamp()]\] Has been smashed with a bottle by [user.name] ([user.ckey])") log_attack("[user.name] ([user.ckey]) attacked [target.name] with a bottle. ([target.ckey])") + log_admin("ATTACK: [user.name] ([user.ckey]) attacked [target.name] with a bottle. ([target.ckey])") + msg_admin_attack("ATTACK: [user.name] ([user.ckey]) attacked [target.name] with a bottle. ([target.ckey])") //BS12 EDIT ALG + + //The reagents in the bottle splash all over the target, thanks for the idea Nodrak if(src.reagents) for(var/mob/O in viewers(user, null)) diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index cf1c5a3e29..e942ad7132 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -67,6 +67,9 @@ log_attack("[user.name] ([user.ckey]) fed [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") + log_admin("ATTACK: [user.name] ([user.ckey]) fed [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") + msg_admin_attack("ATTACK: [user.name] ([user.ckey]) fed [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") //BS12 EDIT ALG + for(var/mob/O in viewers(world.view, user)) O.show_message("\red [user] feeds [M] [src].", 1) @@ -2279,4 +2282,4 @@ New() ..() - reagents.add_reagent("nutriment", 1) + reagents.add_reagent("nutriment", 1) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 3224eaf94a..7908c78402 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -37,7 +37,8 @@ user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to inject [M.name] ([M.ckey])") log_attack("[user.name] ([user.ckey]) injected [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") - + log_admin("ATTACK: [user.name] ([user.ckey]) injected [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") + msg_admin_attack("ATTACK: [user.name] ([user.ckey]) injected [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") //BS12 EDIT ALG src.reagents.reaction(M, INGEST) if(M.reagents) diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 89d9176272..efbcced28b 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -66,6 +66,10 @@ log_attack("[user.name] ([user.ckey]) fed [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") + log_admin("ATTACK: [user.name] ([user.ckey]) fed [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") + msg_admin_attack("ATTACK: [user.name] ([user.ckey]) fed [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") //BS12 EDIT ALG + + if(reagents.total_volume) reagents.reaction(M, INGEST) spawn(5) diff --git a/code/modules/reagents/syringe_gun.dm b/code/modules/reagents/syringe_gun.dm index 89e2993280..6d1412a438 100644 --- a/code/modules/reagents/syringe_gun.dm +++ b/code/modules/reagents/syringe_gun.dm @@ -77,9 +77,17 @@ M.attack_log += "\[[time_stamp()]\] [user]/[user.ckey] shot [M]/[M.ckey] with a syringegun ([R])" user.attack_log += "\[[time_stamp()]\] [user]/[user.ckey] shot [M]/[M.ckey] with a syringegun ([R])" log_attack("[user] ([user.ckey]) shot [M] ([M.ckey]) with a syringegun ([R])") + + log_admin("ATTACK: [user] ([user.ckey]) shot [M] ([M.ckey]) with a syringegun ([R])") + msg_admin_attack("ATTACK: [user] ([user.ckey]) shot [M] ([M.ckey]) with a syringegun ([R])") //BS12 EDIT ALG + else M.attack_log += "\[[time_stamp()]\] UNKNOWN SUBJECT (No longer exists) shot [M]/[M.ckey] with a syringegun ([R])" log_attack("UNKNOWN shot [M] ([M.ckey]) with a syringegun ([R])") + + log_admin("ATTACK: UNKNOWN shot [M] ([M.ckey]) with a syringegun ([R])") + msg_admin_attack("ATTACK: UNKNOWN shot [M] ([M.ckey]) with a syringegun ([R])") //BS12 EDIT ALG + if(D.reagents) D.reagents.trans_to(M, 15) M.take_organ_damage(5) diff --git a/icons/effects/species.dmi b/icons/effects/species.dmi new file mode 100644 index 0000000000000000000000000000000000000000..605ac1df5400bf911068ce6b60d98560d1cb2c3e GIT binary patch literal 25355 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