diff --git a/code/__DEFINES/gamemodes.dm b/code/__DEFINES/gamemodes.dm index 57717103d4bb..c5a221ab8bdb 100644 --- a/code/__DEFINES/gamemodes.dm +++ b/code/__DEFINES/gamemodes.dm @@ -25,6 +25,7 @@ #define F_XENOMORPH_HIVE "Alien Hivemind" #define F_ZOMBIES "Zobmies" #define F_REPLICATORS "Replicators" +#define F_SPACE_TRADERS "Space Traders" // Role IDs #define ABDUCTOR_AGENT "Abductor Agent" @@ -67,6 +68,7 @@ #define REPLICATOR "Replicator" #define PIRATE "Pirate" #define PRISONER "Prisoner" +#define SPACE_TRADER "Space Trader" #define THIEF "Thief" ////////////////////// GREETS ///////////////////////// diff --git a/code/_globalvars/lists/names.dm b/code/_globalvars/lists/names.dm index a9dbe5a51485..d9596e58c962 100644 --- a/code/_globalvars/lists/names.dm +++ b/code/_globalvars/lists/names.dm @@ -14,6 +14,7 @@ var/global/list/pirate_second = file2list("static/names/piratesecond.txt") var/global/list/moth_first = file2list("static/names/moth_first.txt") var/global/list/moth_second = file2list("static/names/moth_second.txt") var/global/list/serpentid_names = file2list("static/names/serpentid.txt") +var/global/list/tajaran_male_first = file2list("static/names/tajaran_male_first.txt") // Traitors key-words var/global/list/rus_nouns diff --git a/code/datums/announcements/events.dm b/code/datums/announcements/events.dm index c53c24f0ee0c..76ba0d7b32ac 100644 --- a/code/datums/announcements/events.dm +++ b/code/datums/announcements/events.dm @@ -266,3 +266,9 @@ name = "Event: Icarus Recovered" subtitle = "Тревога. Сбойные дроны" message = "Контроль дронов ВКН Икар разочарован в потере боевого крыла. Выжившие дроны будут восстановлены." + +/datum/announcement/centcomm/space_traders + name = "Event: Space Traders" + subtitle = "Космоторговцы." + message = "Мы получили и одобрили запрос на стыковку от группы космоторговцев. " + \ + "У них кончаются припасы и есть товары для продажи. Ожидайте гостей." diff --git a/code/datums/outfits/misc/space_traders.dm b/code/datums/outfits/misc/space_traders.dm new file mode 100644 index 000000000000..05bfd40b6a84 --- /dev/null +++ b/code/datums/outfits/misc/space_traders.dm @@ -0,0 +1,33 @@ +/datum/outfit/space_trader + survival_box = TRUE + l_ear = /obj/item/device/radio/headset + +/datum/outfit/space_trader/dealer + name = "Space Trader Dealer" + uniform = /obj/item/clothing/under/lawyer/oldman + suit = /obj/item/clothing/suit/storage/postal_dude_coat + glasses = /obj/item/clothing/glasses/sunglasses + shoes = /obj/item/clothing/shoes/boots + back = /obj/item/weapon/storage/backpack/satchel/norm + + r_pocket = /obj/item/weapon/reagent_containers/spray/pepper + +/datum/outfit/space_trader/guard + name = "Space Trader Guard" + uniform = /obj/item/clothing/under/syndicate + suit = /obj/item/clothing/suit/storage/flak + glasses = /obj/item/clothing/glasses/sunglasses + shoes = /obj/item/clothing/shoes/boots + belt = /obj/item/weapon/storage/belt/security/ert + back = /obj/item/weapon/storage/backpack/satchel/sec + gloves = /obj/item/clothing/gloves/security + suit_store = /obj/item/weapon/gun/energy/gun + backpack_contents = list(/obj/item/clothing/head/helmet) + + r_pocket = /obj/item/clothing/accessory/holster + +/datum/outfit/space_trader/porter + name = "Space Trader Porter" + uniform = /obj/item/clothing/under/rank/cargotech + shoes = /obj/item/clothing/shoes/boots/work + back = /obj/item/weapon/storage/backpack diff --git a/code/datums/spawners_menu/spawners.dm b/code/datums/spawners_menu/spawners.dm index 7b33385889bb..2e70fad8dea7 100644 --- a/code/datums/spawners_menu/spawners.dm +++ b/code/datums/spawners_menu/spawners.dm @@ -746,3 +746,100 @@ var/datum/role/wizard/R = SSticker.mode.CreateRole(/datum/role/wizard, H) R.rename = FALSE setup_role(R, TRUE) + +/* + * SPACE TRADERS +*/ +/datum/spawner/space_trader + name = "Космический торговец" + desc = "Космический торговец." + + ranks = list(ROLE_GHOSTLY) + + register_only = TRUE + time_for_registration = 0.5 MINUTES + + time_while_available = 4 MINUTES + var/money = 100 + var/outfit + var/skillset + +/datum/spawner/space_trader/spawn_body(mob/dead/spectator) + var/spawnloc = pick_spawn_location() + var/client/C = spectator.client + + var/mob/living/carbon/human/H = new + C.create_human_apperance(H) + H.key = C.key + H.forceMove(spawnloc) + equip(H) + + var/datum/faction/space_traders/F = find_faction_by_type(/datum/faction/space_traders) + add_faction_member(F, H, TRUE, TRUE) + +/datum/spawner/space_trader/proc/equip(mob/living/carbon/human/H) + H.equipOutfit(outfit) + H.mind.skills.add_available_skillset(skillset) + H.mind.skills.maximize_active_skills() + + var/datum/money_account/MA = create_random_account_and_store_in_mind(H, money) + var/obj/item/weapon/card/id/cargo/C = new(H) + C.rank = "Space Trader" + C.assignment = C.rank + C.assign(H.real_name) + C.access = list(access_space_traders) + C.associated_account_number = MA.account_number + H.equip_or_collect(C, SLOT_WEAR_ID) + + var/obj/item/device/pda/pda = new(H) + pda.assign(H.real_name) + pda.ownrank = C.rank + pda.owner_account = MA.account_number + pda.owner_fingerprints += C.fingerprint_hash + MA.owner_PDA = pda + H.equip_or_collect(pda, SLOT_R_STORE) + +/datum/spawner/space_trader/dealer + name = "Космоторговец барыга" + desc = "Барыга, владеющий торговым судном и товаром на нём. Заработайте столько денег, сколько сможете увезти!" + spawn_landmark_name = "Space Trader Dealer" + money = 200 + outfit = /datum/outfit/space_trader/dealer + skillset = /datum/skillset/quartermaster + +/datum/spawner/space_trader/guard + name = "Космоторговец охранник" + desc = "ЧОПовец, нанятый барыгой для охраны судна и товара на нём от станционных воришек и космических пиратов." + spawn_landmark_name = "Space Trader Guard" + outfit = /datum/outfit/space_trader/guard + skillset = /datum/skillset/officer + +/datum/spawner/space_trader/porter + name = "Космоторговец посыльный" + desc = "Таяран грузчик, работающий на барыгу. Таскайте грузы, выставляйте товары на продажу, помогите барыге обогатиться и не забудьте спросить свою долю!" + spawn_landmark_name = "Space Trader Porter" + money = 20 + outfit = /datum/outfit/space_trader/porter + skillset = /datum/skillset/cargotech + +/datum/spawner/space_trader/porter/spawn_body(mob/dead/spectator) + var/spawnloc = pick_spawn_location() + var/client/C = spectator.client + + var/mob/living/carbon/human/H + var/new_name + + if(is_alien_whitelisted_banned(spectator, TAJARAN) || !is_alien_whitelisted(spectator, TAJARAN)) + H = new + else + H = new(null, TAJARAN) + new_name = capitalize(pick(global.tajaran_male_first)) + " " + capitalize(pick(global.last_names)) + + C.create_human_apperance(H, new_name) + H.key = C.key + H.forceMove(spawnloc) + equip(H) + + var/datum/faction/space_traders/F = find_faction_by_type(/datum/faction/space_traders) + add_faction_member(F, H, TRUE, TRUE) + diff --git a/code/game/area/shuttle_areas.dm b/code/game/area/shuttle_areas.dm index dcfb49b93184..fe5921f64c77 100644 --- a/code/game/area/shuttle_areas.dm +++ b/code/game/area/shuttle_areas.dm @@ -262,17 +262,19 @@ icon_state = "shuttlered2" looped_ambience = 'sound/ambience/loop_space.ogg' -//Administration Centcom Shuttle -/area/shuttle/administration/centcom - name = "Administration Shuttle Centcom" - cases = list("административный шаттл", "административного шаттла", "административному шаттлу", "административный шаттл", "административным шаттлом", "административном шаттле") +//Space Traders Shuttle +/area/shuttle/trader + name = "Trader Shuttle" + cases = list("торговый шаттл", "торгового шаттла", "торговому шаттлу", "торговый шаттл", "торговым шаттлом", "торговом шаттле") icon_state = "shuttlered" -/area/shuttle/administration/station - name = "Administration Shuttle" - cases = list("административный шаттл", "административного шаттла", "административному шаттлу", "административный шаттл", "административным шаттлом", "административном шаттле") +/area/shuttle/trader/station + name = "Trader Shuttle Station" + ambience = 'sound/ambience/space_traders.ogg' + +/area/shuttle/trader/space + name = "Trader Shuttle Space" icon_state = "shuttlered2" - looped_ambience = 'sound/ambience/loop_space.ogg' //Vox shuttle /area/shuttle/vox/arkship @@ -390,7 +392,6 @@ var/global/list/centcom_shuttle_areas = list ( /area/shuttle/escape_pod3/centcom, /area/shuttle/escape_pod4/centcom, /area/shuttle/transport1/centcom, - /area/shuttle/administration/centcom, /area/shuttle/specops/centcom, /area/shuttle/officer/centcom ) @@ -403,7 +404,7 @@ var/global/list/station_shuttle_areas = list ( /area/shuttle/escape_pod3/station, /area/shuttle/escape_pod4/station, /area/shuttle/transport1/station, - /area/shuttle/administration/station, + /area/shuttle/trader/station, /area/shuttle/specops/station, /area/shuttle/officer/station, /area/shuttle/supply/station, diff --git a/code/game/gamemodes/factions/space_traders.dm b/code/game/gamemodes/factions/space_traders.dm new file mode 100644 index 000000000000..8608da00be2d --- /dev/null +++ b/code/game/gamemodes/factions/space_traders.dm @@ -0,0 +1,33 @@ +/obj/effect/landmark/space_traders/product + name = "Space Traders Product" + icon = 'icons/obj/storage.dmi' + icon_state = "crate" + +/obj/effect/landmark/space_traders/dealer + name = "Space Trader Dealer" + icon = 'icons/mob/landmarks.dmi' + icon_state = "Quartermaster" + +/obj/effect/landmark/space_traders/guard + name = "Space Trader Guard" + icon = 'icons/mob/landmarks.dmi' + icon_state = "Blueshield Officer" + +/obj/effect/landmark/space_traders/porter + name = "Space Trader Porter" + icon = 'icons/mob/landmarks.dmi' + icon_state = "Trader Porter" + +/datum/faction/space_traders + name = F_SPACE_TRADERS + ID = F_SPACE_TRADERS + + logo_state = "space_traders" + max_roles = 3 + roletype = /datum/role/space_trader + +/datum/faction/space_traders/forgeObjectives() + if(!..()) + return FALSE + AppendObjective(/datum/objective/make_money/faction/traders) + return TRUE diff --git a/code/game/gamemodes/objectives/traders_objectives.dm b/code/game/gamemodes/objectives/traders_objectives.dm new file mode 100644 index 000000000000..9b1c6bf21c87 --- /dev/null +++ b/code/game/gamemodes/objectives/traders_objectives.dm @@ -0,0 +1,102 @@ +/datum/objective/make_money + var/required_money + +/datum/objective/make_money/New() + explanation_text = "Заработать [required_money] кредитов. В конце смены они должны находиться на вашем счёте." + +/datum/objective/make_money/check_completion() + if(owner) + var/datum/money_account/MA = get_account(owner.get_key_memory(MEM_ACCOUNT_NUMBER)) + if(MA.money >= required_money) + return OBJECTIVE_WIN + return OBJECTIVE_LOSS + +/datum/objective/make_money/faction/check_completion() + if(faction) + var/total_money = 0 + for(var/datum/role/R in faction.members) + var/datum/money_account/MA = get_account(R.antag.get_key_memory(MEM_ACCOUNT_NUMBER)) + total_money += MA.money + if(total_money >= required_money) + return OBJECTIVE_WIN + return OBJECTIVE_LOSS + +/datum/objective/make_money/faction/traders + required_money = 20000 + + +/datum/objective/trader_purchase + var/list/items = list() + var/static/possible_items[] = list( + "эмиттер" = /obj/machinery/power/emitter, + "инкубатор вирусов" = /obj/machinery/disease2/incubator, + "хим диспенсер" = /obj/machinery/chem_dispenser, + "микроволновку" = /obj/machinery/kitchen_machine/microwave, + "бипски" = /obj/machinery/bot/secbot/beepsky, + "биогенератор" = /obj/machinery/biogenerator, + "экстрактор семян" = /obj/machinery/seed_extractor, + "бухломат" = /obj/machinery/vending/boozeomat, + "переносной флэшер" = /obj/machinery/flasher/portable, + "шкаф главы службы безопасности" = /obj/structure/closet/secure_closet/hos, + "канистру азота" = /obj/machinery/portable_atmospherics/canister/nitrogen, + "факс" = /obj/machinery/faxmachine, + "ядерную боеголовку" = /obj/machinery/nuclearbomb, + "раздатчик атмосферных труб" = /obj/machinery/pipedispenser, + "кошку главврача Дасти" = /mob/living/simple_animal/cat/dusty, + "плазменный дробовик" = /obj/item/weapon/gun/plasma/p104sass, + "ручной телепортер" = /obj/item/weapon/hand_tele, + "тыквяк" = /obj/item/weapon/reagent_containers/food/snacks/grown/gourd, + "имплант защиты разума" = /obj/item/weapon/implantcase/mindshield, + "смирительную рубашку" = /obj/item/clothing/suit/straight_jacket, + "капитанское жёлтое мыло" = /obj/item/weapon/reagent_containers/food/snacks/soap/deluxe, + "мулбота" = /obj/machinery/bot/mulebot, + "новогоднюю ёлку" = /obj/item/device/flashlight/lamp/fir, + "двухстволку бармена" = /obj/item/weapon/gun/projectile/revolver/doublebarrel, + "джукбокс" = /obj/machinery/media/jukebox/bar, + "полностью собранное ядро ИИ" = /obj/structure/AIcore/deactivated, + "алтарь священника" = /obj/structure/altar_of_gods) + +/datum/objective/trader_purchase/New() + var/indx = rand(1, possible_items.len) + var/offset = rand(1, possible_items.len - 1) + var/new_indx = (indx + offset) % possible_items.len + items += possible_items[indx] + items += possible_items[new_indx == 0 ? possible_items.len : new_indx] + explanation_text = "Достать и притащить на наш шаттл [items[1]] и [items[2]]." + +/datum/objective/trader_purchase/check_completion() + var/list/areas = list(/area/shuttle/trader/space, /area/shuttle/trader/station) + var/list/checks = list(FALSE, FALSE) + for(var/type in areas) + for(var/obj/O in get_area_by_type(type)) + if(istype(O, possible_items[items[1]])) + checks[1] = TRUE + else if(istype(O, possible_items[items[2]])) + checks[2] = TRUE + if(checks[1] && checks[2]) + return OBJECTIVE_WIN + else if(checks[1] || checks[2]) + return OBJECTIVE_HALFWIN + return OBJECTIVE_LOSS + + +/datum/objective/traders_escape + explanation_text = "Живыми улететь на своём шаттле со станции." + +/datum/objective/traders_escape/check_completion() + var/counter = 0 + if(faction) + var/list/mems = faction.members + for(var/datum/role/R in mems) + var/mob/M = R.antag.current + if(!M || ((M.stat == DEAD) && !M.fake_death) || isbrain(M) || issilicon(M)) // alive? + continue + if(istype(get_area(M), /area/shuttle/trader/space)) // in space on shuttle? + counter++ + if(counter == mems.len) // ALL TRADERS ESCAPE ALIVE + return OBJECTIVE_WIN + else if(counter) // AT LEAST ONE TRADER ESCAPE ALIVE + return OBJECTIVE_HALFWIN + else + return OBJECTIVE_LOSS + return OBJECTIVE_LOSS diff --git a/code/game/gamemodes/roles/space_trader.dm b/code/game/gamemodes/roles/space_trader.dm new file mode 100644 index 000000000000..301fdf3eadba --- /dev/null +++ b/code/game/gamemodes/roles/space_trader.dm @@ -0,0 +1,25 @@ +/datum/role/space_trader + name = SPACE_TRADER + id = SPACE_TRADER + + disallow_job = TRUE + logo_state = "space_traders" + +/datum/role/space_trader/Greet(greeting, custom) + . = ..() + to_chat(antag.current, {"Вы - космический торговец. Всего вас трое. +
1. Барыга - он главный, он владеет всем, он нанимает остальных, он отдаёт приказы, он решает что делать. +Слушайтесь его и помогайте ему. +
2. ЧОПовец - охранник корабля и товара, у него есть ствол и полное право использовать его на территории корабля. +Но даже в мыслях не имейте стреляться с кем-то на станции, это явно не понравится службе безопасности. +
3. Грузчик - мальчик на побегушках, таскает товар, гоняет на станцию за едой и припасами. +
Кем бы вы ни были, вы все имеете 3 общие цели. +
1. Заработать денег. +В трюме корабля навалом товара, сбудьте его по как можно большей цене, торгуйтесь за каждую безделушку. +Не весь товар легален. В трюме, справа от постера, есть тайник, никто со станции не сможет его открыть, можете спокойно прятать там контрабанду. +Если товар распродан, оказывайте услуги, ради денег вы даже можете нарушить закон, но будьте готовы к соответствующей реакции со стороны службы безопасности. +
2. Достать на шаттл какие-то вещи. +Для достижения цели можете делать что угодно. Попытаетесь вы выкупить или украсть, подрядите кого-то сделать или достать. +Главное чтобы нужные вещи были на корабле, когда смена на станции закончится. +
3. Улететь со станции живыми. Крайне желательно сделать это в полном составе. +------------------
"}) diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index 3376a886e282..d99a2f0c11a4 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -71,6 +71,7 @@ /var/const/access_engineering_lobby = 71 /var/const/access_medbay_storage = 72 /var/const/access_oldstation = 73 +/var/const/access_space_traders = 74 //BEGIN CENTCOM ACCESS /*Should leave plenty of room if we need to add more access levels. @@ -554,7 +555,8 @@ "Marine", "Marine Squad Leader", "Senior Engineer", - "Senior Medic") + "Senior Medic", + "Space Trader") /obj/proc/GetJobName() //Used in secHUD icon generation if (!istype(src, /obj/item/device/pda) && !istype(src,/obj/item/weapon/card/id)) diff --git a/code/game/machinery/computer/trader_shuttle.dm b/code/game/machinery/computer/trader_shuttle.dm new file mode 100644 index 000000000000..347d477fb4ef --- /dev/null +++ b/code/game/machinery/computer/trader_shuttle.dm @@ -0,0 +1,92 @@ +#define TRADER_SHUTTLE_COOLDOWN 5 MINUTE + +/obj/machinery/computer/trader_shuttle + name = "Shuttle Console" + icon_state = "shuttle" + cases = list("консоль шаттла", "консоли шаттла", "консоли шаттла", "консоль шаттла", "консолью шаттла", "консоли шаттла") + resistance_flags = FULL_INDESTRUCTIBLE + var/docked = TRUE + var/lastmove = 0 + var/area/space_location + var/area/station_location + +/obj/machinery/computer/trader_shuttle/atom_init() + ..() + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/computer/trader_shuttle/atom_init_late() + space_location = locate(/area/shuttle/trader/space) in all_areas + station_location = locate(/area/shuttle/trader/station) in all_areas + +/obj/machinery/computer/trader_shuttle/ui_interact(mob/user) + var/dat + + if(docked) + if(world.time < lastMove + TRADER_SHUTTLE_COOLDOWN) + dat += "