From eade7ffc266965aacdfdd3cb165b2391b732232a Mon Sep 17 00:00:00 2001 From: Heroman Date: Fri, 14 Jul 2023 17:38:02 +1000 Subject: [PATCH] Adds altevian NPCs for event use --- .../objects/items/weapons/storage/boxes_vr.dm | 11 +- code/modules/mob/dead/corpse.dm | 77 +++++++++- code/modules/mob/dead/corpse_vr.dm | 16 +++ .../subtypes/humanoid/mercs/mercs_altevian.dm | 131 ++++++++++++++++++ icons/mob/altevian_mercs_vr.dmi | Bin 0 -> 3564 bytes vorestation.dme | 1 + 6 files changed, 231 insertions(+), 5 deletions(-) create mode 100644 code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs_altevian.dm create mode 100644 icons/mob/altevian_mercs_vr.dmi diff --git a/code/game/objects/items/weapons/storage/boxes_vr.dm b/code/game/objects/items/weapons/storage/boxes_vr.dm index dd5ff003f4..dbb9ab8760 100644 --- a/code/game/objects/items/weapons/storage/boxes_vr.dm +++ b/code/game/objects/items/weapons/storage/boxes_vr.dm @@ -38,4 +38,13 @@ starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax/red = 6) /obj/item/weapon/storage/box/freezer - can_hold = list(/obj/item/organ, /obj/item/weapon/reagent_containers/blood, /obj/item/weapon/reagent_containers/glass, /obj/item/weapon/reagent_containers/food) \ No newline at end of file + can_hold = list(/obj/item/organ, /obj/item/weapon/reagent_containers/blood, /obj/item/weapon/reagent_containers/glass, /obj/item/weapon/reagent_containers/food) + +/obj/item/weapon/storage/box/altevian_ammo + name = "SAM .48 ammo box" + desc = "A box of ratty ammo." + icon_state = "secbox" + starts_with = list(/obj/item/ammo_magazine/sam48 = 3) + max_storage_space = ITEMSIZE_COST_NORMAL * 3 + drop_sound = 'sound/items/drop/ammobox.ogg' + pickup_sound = 'sound/items/pickup/ammobox.ogg' \ No newline at end of file diff --git a/code/modules/mob/dead/corpse.dm b/code/modules/mob/dead/corpse.dm index b02859f451..2b06b23dd2 100644 --- a/code/modules/mob/dead/corpse.dm +++ b/code/modules/mob/dead/corpse.dm @@ -26,6 +26,12 @@ var/corpseidjob = null // Needs to be in quotes, such as "Clown" or "Chef." This just determines what the ID reads as, not their access var/corpseidaccess = null //This is for access. See access.dm for which jobs give what access. Again, put in quotes. Use "Captain" if you want it to be all access. var/corpseidicon = null //For setting it to be a gold, silver, CentCom etc ID + var/species = SPECIES_HUMAN //defaults to generic-ass humans + var/random_species = FALSE //flip to TRUE to randomize species from the list below + var/list/random_species_list = list(SPECIES_HUMAN,SPECIES_TAJ,SPECIES_UNATHI,SPECIES_SKRELL) + var/list/tail_type = null + var/list/ear_type = null + var/list/wing_type = null var/corpsesynthtype = 0 // 0 for organic, 1 for drone, 2 for posibrain var/corpsesynthbrand = "Unbranded" @@ -34,6 +40,69 @@ /obj/effect/landmark/mobcorpse/proc/createCorpse() //Creates a mob and checks for gear in each slot before attempting to equip it. var/mob/living/carbon/human/M = new /mob/living/carbon/human (src.loc) + if(random_species) + var/random_pick = pick(random_species_list) + M.set_species(random_pick) + src.species = random_pick + else + M.set_species(species) + if(tail_type && tail_type.len) + if(tail_type[1] in tail_styles_list) + M.tail_style = tail_styles_list[tail_type[1]] + if(tail_type.len > 1) + var/list/color_rgb_list = hex2rgb(tail_type[2]) + M.r_tail = color_rgb_list[1] + M.g_tail = color_rgb_list[2] + M.b_tail = color_rgb_list[3] + if(tail_type.len > 2) + color_rgb_list = hex2rgb(tail_type[3]) + M.r_tail2 = color_rgb_list[1] + M.g_tail2 = color_rgb_list[2] + M.b_tail2 = color_rgb_list[3] + if(tail_type.len > 3) + color_rgb_list = hex2rgb(tail_type[4]) + M.r_tail3 = color_rgb_list[1] + M.g_tail3 = color_rgb_list[2] + M.b_tail3 = color_rgb_list[3] + M.update_tail_showing() + if(ear_type && ear_type.len) + if(ear_type[1] in ear_styles_list) + M.ear_style = ear_styles_list[ear_type[1]] + if(ear_type.len > 1) + var/list/color_rgb_list = hex2rgb(ear_type[2]) + M.r_ears = color_rgb_list[1] + M.g_ears = color_rgb_list[2] + M.b_ears = color_rgb_list[3] + if(ear_type.len > 2) + color_rgb_list = hex2rgb(ear_type[3]) + M.r_ears2 = color_rgb_list[1] + M.g_ears2 = color_rgb_list[2] + M.b_ears2 = color_rgb_list[3] + if(ear_type.len > 3) + color_rgb_list = hex2rgb(ear_type[4]) + M.r_ears3 = color_rgb_list[1] + M.g_ears3 = color_rgb_list[2] + M.b_ears3 = color_rgb_list[3] + M.update_hair() + if(wing_type && wing_type.len) + if(wing_type[1] in wing_styles_list) + M.wing_style = wing_styles_list[wing_type[1]] + if(wing_type.len > 1) + var/list/color_rgb_list = hex2rgb(wing_type[2]) + M.r_wing = color_rgb_list[1] + M.g_wing = color_rgb_list[2] + M.b_wing = color_rgb_list[3] + if(wing_type.len > 2) + color_rgb_list = hex2rgb(wing_type[3]) + M.r_wing2 = color_rgb_list[1] + M.g_wing2 = color_rgb_list[2] + M.b_wing2 = color_rgb_list[3] + if(wing_type.len > 3) + color_rgb_list = hex2rgb(wing_type[4]) + M.r_wing3 = color_rgb_list[1] + M.g_wing3 = color_rgb_list[2] + M.b_wing3 = color_rgb_list[3] + M.update_wing_showing() M.real_name = generateCorpseName() M.set_stat(DEAD) //Kills the new mob if(corpsesynthtype > 0) @@ -48,8 +117,6 @@ O.robotize(corpsesynthbrand) if(src.corpseuniform) M.equip_to_slot_or_del(new src.corpseuniform(M), slot_w_uniform) - if(src.corpsesuit) - M.equip_to_slot_or_del(new src.corpsesuit(M), slot_wear_suit) if(src.corpseshoes) M.equip_to_slot_or_del(new src.corpseshoes(M), slot_shoes) if(src.corpsegloves) @@ -60,8 +127,6 @@ M.equip_to_slot_or_del(new src.corpseglasses(M), slot_glasses) if(src.corpsemask) M.equip_to_slot_or_del(new src.corpsemask(M), slot_wear_mask) - if(src.corpsehelmet) - M.equip_to_slot_or_del(new src.corpsehelmet(M), slot_head) if(src.corpsebelt) M.equip_to_slot_or_del(new src.corpsebelt(M), slot_belt) if(src.corpsepocket1) @@ -90,6 +155,10 @@ W.assignment = corpseidjob W.registered_name = M.real_name M.equip_to_slot_or_del(W, slot_wear_id) + if(src.corpsehelmet) + M.equip_voidhelm_to_slot_or_del_with_refit(new src.corpsehelmet(M), slot_head, src.species) + if(src.corpsesuit) + M.equip_voidsuit_to_slot_or_del_with_refit(new src.corpsesuit(M), slot_wear_suit, src.species) delete_me = 1 qdel(src) diff --git a/code/modules/mob/dead/corpse_vr.dm b/code/modules/mob/dead/corpse_vr.dm index 487de64d95..ac1496b7d6 100644 --- a/code/modules/mob/dead/corpse_vr.dm +++ b/code/modules/mob/dead/corpse_vr.dm @@ -24,3 +24,19 @@ var/number = rand(0,999) var/purpose = pick(list("Recon","Combat","Kill","Guard","Scout","Murder","Capture","Raid","Attack","Battle")) return "[letter]-[number] [purpose] Droid" + +/obj/effect/landmark/mobcorpse/altevian + name = "Altevian Naval Officer" + corpseuniform = /obj/item/clothing/under/altevian + corpsesuit = /obj/item/clothing/suit/space/void/altevian_heartbreaker + corpseshoes = /obj/item/clothing/shoes/boots/swat + corpsegloves = /obj/item/clothing/gloves/swat + corpseradio = /obj/item/device/radio/headset + corpsemask = /obj/item/clothing/mask/altevian_breath + corpsehelmet = /obj/item/clothing/head/helmet/space/void/altevian_heartbreaker + corpseid = 1 + corpseidjob = "Altevian Navy" + corpseidaccess = "Syndicate" + species = SPECIES_ALTEVIAN + ear_type = list(/datum/sprite_accessory/ears/altevian, "#777777", "#FFCCFF") + tail_type = list(/datum/sprite_accessory/tail/altevian, "#FF9999") \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs_altevian.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs_altevian.dm new file mode 100644 index 0000000000..b623e850b3 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs_altevian.dm @@ -0,0 +1,131 @@ +/mob/living/simple_mob/humanoid/merc/altevian + name = "altevian naval officer" + desc = "Altevian Naval Slicer, adorned in the top of the line Heartbreaker suit. Armed with a handheld cutter." + tt_desc = "E Rattus sapiens" + icon = 'icons/mob/altevian_mercs_vr.dmi' + icon_state = "merc_melee_cutter" + icon_living = "merc_melee_cutter" + icon_dead = "merc-dead" + icon_gib = "merc_gib" + + faction = "altevian" + movement_cooldown = 1 + + status_flags = 0 + + response_help = "pokes" + response_disarm = "shoves" + response_harm = "hits" + + harm_intent_damage = 5 + melee_damage_lower = 30 + melee_damage_upper = 30 + attack_armor_pen = 50 + attack_sharp = TRUE + attack_edge = 1 + attacktext = list("slashed") + armor = list(melee = 90, bullet = 90, laser = 90, energy = 90, bomb = 90, bio = 100, rad = 100) //matches stats of suit they drop. Basically tank. Rat tank. Ratank. + + corpse = /obj/effect/landmark/mobcorpse/altevian + loot_list = list(/obj/item/weapon/melee/energy/sword/altevian = 100) + + ai_holder_type = /datum/ai_holder/simple_mob/merc + say_list_type = /datum/say_list/merc/altevian + +/datum/say_list/merc/altevian + speak = list("Operations going along as planned.", + "No news to report, Mission Control. All is clear.", + "Salvage operations still underway, no updates yet, Mission Control.") + emote_see = list("squeaks", "flicks their tail", "looks around") + + say_understood = list("Order received.", "Understood, Mission Control.") + say_cannot = list("Unable to fulfill that request.", "Sorry... Running into some issues.") + say_maybe_target = list("Hey... You can't hide after causing us trouble, mate...", "If you're hiding... You better be hiding well...", "Yeah... You better have left after causing us trouble...") + say_got_target = list("Mouse found!", "Hostile being culled!", "Removing unwanted salvage!", "Culling threats!", "Suppressing!") + say_threaten = list("This area is marked for salvage by the Hegemony, please vacate the area until we're done!", "Sorry, but we're conducting operations here and civilians are not permitted around here for the time being!", "Please disperse from the area, or we will have to respond in kind.") + say_stand_down = list("Thank you for listening! Please have a safe day!", "Carry along, and keep safe.", "You're cleared to depart, thank you for not causing problems.") + say_escalate = list("Team, we have mice attempting to steal our salvage!", "We've warned you! Please know this is just us following orders!", "Apologies, but we have to attack due to failing to listen to our order!") + + threaten_sound = 'sound/weapons/TargetOn.ogg' + stand_down_sound = 'sound/weapons/TargetOff.ogg' + +/mob/living/simple_mob/humanoid/merc/altevian/sapper + desc = "Altevian Naval Sapper, adorned in the top of the line Heartbreaker suit. Armed with a giant fokken wrench." + icon_state = "merc_melee_wrench" + icon_living = "merc_melee_wrench" + + melee_damage_lower = 25 + melee_damage_upper = 25 + attack_armor_pen = 0 + attack_sharp = FALSE + attack_edge = 0 + attacktext = list("whacked", "slammed", "bashed", "clonked", "bonked") + attack_sound = 'sound/weapons/smash.ogg' + + loot_list = list(/obj/item/weapon/melee/altevian_wrench = 100) + +/mob/living/simple_mob/humanoid/merc/altevian/ranged + desc = "Altevian Naval Salvage Guard, adorned in the top of the line Heartbreaker suit. Armed with a small energy gun." + icon_state = "merc_gun_smol" + icon_living = "merc_gun_smol" + + + melee_damage_lower = 15 // Let's just pretend they have tacknife + melee_damage_upper = 15 + attack_armor_pen = 20 + base_attack_cooldown = 8 + + loot_list = list(/obj/item/weapon/gun/energy/altevian = 100) + + needs_reload = TRUE + reload_time = 1.5 SECONDS + reload_max = 6 + projectiletype = /obj/item/projectile/beam/meeplaser + projectilesound = 'sound/weapons/Laser.ogg' + + ai_holder_type = /datum/ai_holder/simple_mob/merc/ranged + +/mob/living/simple_mob/humanoid/merc/altevian/ranged/strong + desc = "Altevian Naval Salvage Shield, adorned in the top of the line Heartbreaker suit. Armed with a large energy gun." + icon_state = "merc_gun_big" + icon_living = "merc_gun_big" + + base_attack_cooldown = 8 + + loot_list = list(/obj/item/weapon/gun/energy/altevian/large = 100) + + needs_reload = TRUE + reload_time = 3 SECONDS + reload_max = 12 + projectiletype = /obj/item/projectile/beam/meeplaser/strong + projectilesound = 'sound/weapons/Laser.ogg' + +/mob/living/simple_mob/humanoid/merc/altevian/ranged/ballistic + desc = "Altevian Naval Shipbreaker, adorned in the top of the line Heartbreaker suit. Armed with a bolter gun." + icon_state = "merc_gun_ballistic" + icon_living = "merc_gun_ballistic" + + base_attack_cooldown = 10 + + loot_list = list(/obj/item/weapon/storage/box/altevian_ammo = 100, /obj/item/weapon/gun/projectile/altevian = 100) + + needs_reload = TRUE + reload_time = 5 SECONDS + reload_max = 5 + projectiletype = /obj/item/projectile/bullet/sam48 + projectilesound = 'sound/weapons/Gunshot_heavy.ogg' + +/mob/living/simple_mob/humanoid/merc/altevian/neutral + faction = "neutral" + +/mob/living/simple_mob/humanoid/merc/altevian/sapper/neutral + faction = "neutral" + +/mob/living/simple_mob/humanoid/merc/altevian/ranged/neutral + faction = "neutral" + +/mob/living/simple_mob/humanoid/merc/altevian/ranged/strong/neutral + faction = "neutral" + +/mob/living/simple_mob/humanoid/merc/altevian/ranged/ballistic/neutral + faction = "neutral" \ No newline at end of file diff --git a/icons/mob/altevian_mercs_vr.dmi b/icons/mob/altevian_mercs_vr.dmi new file mode 100644 index 0000000000000000000000000000000000000000..aea4bcb8e918f009816454aecbd20b5413ed1a32 GIT binary patch literal 3564 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 Z@S%vUyumOP{G&i1`%^A9uaT(a{{foQK!N}O literal 0 HcmV?d00001 diff --git a/vorestation.dme b/vorestation.dme index b3db27704f..207424cf1f 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -3142,6 +3142,7 @@ #include "code\modules\mob\living\simple_mob\subtypes\humanoid\pirates.dm" #include "code\modules\mob\living\simple_mob\subtypes\humanoid\russian.dm" #include "code\modules\mob\living\simple_mob\subtypes\humanoid\mercs\mercs.dm" +#include "code\modules\mob\living\simple_mob\subtypes\humanoid\mercs\mercs_altevian.dm" #include "code\modules\mob\living\simple_mob\subtypes\humanoid\mercs\mercs_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\illusion\illusion.dm" #include "code\modules\mob\living\simple_mob\subtypes\mechanical\corrupt_maint_drone_vr.dm"