Архив сообщества
2011 — 2019
Аватар Чудо

Новый режим: The Alchemist

Автор: Чудо · 02.11.2014, 11:43 · 25 сообщений

Сообщений в теме: 25

Чудо#1
alfa
THE ALCHEMIST

Адепт (или несколько) древнего таинственного ордена Алхимиков Сингулярности прибывает на Космическую Станцию 13 с заданием на кражу секретных научных разработок.

Орден Алхимиков Сингулярности — древняя организация жидоящеров с далеких звезд, изгнанная со своей планеты более доминирующим видом, и с тех пор скитающаяся по миру в поисках нового дома. Жидоящеры глубоко религиозная раса, признающая своим божеством Космическое Золото — некое не физическое существо определяющее ценность всего материального, а потому жидоящеры более всего на свете ценят деньги. Это, например, наиболее ярко проявляется в многовековом народном фольклоре. Наиболее известны такие поговорки жидоящеров: "какой бы сладкой не была любовь, а деньги лучше", "деньги - всему голова", "любишь жену - но деньги люби больше", и так далее. Долгие скитания и природная неспособность к быстрому размножению поставили орден на грань вымирания, и старейшины допустили в свои ряды новобранцев других рас.

Адепт вооружен драгоценным алхимическим камнем, способным превращать вещи в деньги. Чем больше вещей превращено, тем более сильным становится камень, и тем более крупные вещи он может превращать. Самые сильные камни способны превратить в деньги не только человека, но и сингулярность! Чем больше предмет, тем в большее количество денег он превращается после алхимического ритуала.

Однако великое божество Космическое Золото с презрением относится к потерявшим голову от жадности, всячески играя с их страстями. В частности это проявляется в способности камня дать сбой, и превратить предмет не в деньги, а в анти-деньги. Купюры, которые живут своей собственной жизнью и поглощают небольшие вещи и предметы, исчезая, при этом, сами. На людей они нападают, как бы покусывая, пытаясь поглотить хотя бы их часть. Но шанс такого феномена не велик.

СУТЬ

Адепт, как и агент Синдиката, появляется среди обычных сотрудников станции, с алхимическим камнем в кармане. Помимо заданий на кражу каких-либо вещей, одним из обязательных будет раскачка камня до определенного значения и эвакуация на спасательном шатле в свободной зоне.

Начиная раскачку камня на мелких предметах адепт столкнется с проблемой огромного количества денег, которые непременно будут привлекать внимание к его персоне. Чем более растет сила камня, тем более заметны пропажи предметов. А шанс превращения предмета в анти-деньги способствует поднятию тревоги среди персонала.

* Вероятно камень следует заменить на личное заклинание или силу, как у генокрада.
* Чтобы камень мог превратить человека или сингулярность в деньги он должен быть ОЧЕНЬ сильно раскачан.
* Чем больше предмет, на который воздействует камень, тем в больше количество денег он превращается.
* Анти-деньги при поглощении других предметов уничтожаются.
* Анти-деньги могут поглощать деньги.
* Анти-деньги не могут поглотить человека, но нападают на него.
* Камень не может воздействовать на деньги.
* Сильно раскаченный камень может превращать структуры вроде стен в деньги.
* Возможно стоит сделать Алхимика не отдельным режимом, а дополнительной спецролью. Следует тестировать общий концепт и развивать идеи по мере тестов.
* Алхимики не призваны подрывать работу станции. Их главная цель - кража технологий для ордена и личное обогащение.
* Более всего на свете алхимики любят деньги.

ИСПОЛНЕНИЕ
Алхимический камень от Reaper9:
Спойлер
/obj/item/device/alchemstone
name = "alchemy stone"
desc = "Strange stone."
icon = 'icons/obj/items.dmi'
icon_state = "alchstone"
item_state = "alchstone"
w_class = 2.0
var/exp=0//Опыт
var/level=0//Уровень


obj/item/device/alchemstone/proc/attack(obj/item/I as item, mob/user as mob)

if(istype(target,/obj/item) && !istype(target, /obj/item/weapon/disk/nuclear))

if(target,obj/item.w_class==1)
transform(I,user)

if(target,obj/item.w_class==2 && level>=1)
transform(I,user)

if(target,obj/item.w_class==3 && level>=2)
transform(I,user)

if(target,obj/item.w_class==4 && level>=3)
transform(I,user)


obj/item/device/alchemstone/proc/transform(obj/item/T as item, mob/user as mob)

if(T.w_class==1)
new /obj/item/weapon/spacecash/c1(src)
T.del()
addExp(1)
user << "Your transformed the [T] into money."
O.show_message("The [T] was transformed into money by [user]!", 1, "You see the [T] transforming into money.", 2)
if(T.w_class==2)
new /obj/item/weapon/spacecash/c10(src)
T.del()
addExp(10)

if(T.w_class==3)
new /obj/item/weapon/spacecash/c20(src)
T.del()
addExp(20)

if(T.w_class==4)
new /obj/item/weapon/spacecash/c50(src)
T.del()
addExp(50)


obj/item/device/alchemstone/proc/addExp(var/amount)
exp=exp+amount

if(exp==25 && level=0)
level=1
exp=0

if(exp>=250 && level<2)
level=2
exp=0

if(exp>=600 && level<3)
level=3
exp=0



Спойлер
else if (istype(W, /obj/item/device/alchemstone))

if(W.level>=6)
user << "You begin to transform the wall into money."

sleep(100)

if( !istype(src, /turf/simulated/wall) || !user || !W || !T ) return

if( user.loc == T && user.get_active_hand() == W )
user << "Your transformed the wall into money."
Del()
new /obj/item/weapon/spacecash/c200(src)
for(var/mob/O in viewers(user, 5))
O.show_message("The wall was transformed into money by [user]!", 1, "You see the wall transforming into money.", 2)
return

Сообщение отредактировал Чудо: 03 November 2014 - 00:27
14
Делайте игру. Не форум.
Скопировать ссылку
Navedan#3
Идея конечно интересная, но вот деньги тут никому не нужны. Что печально.
А камень надо оставить, но дать возможность использовать только ролке. А то еще будет " СБ превращает преступников в деньги, ПОКАЙТЕСЬ!".

ACCount (02 November 2014 - 01:46) писал: писал:
Кодь.
Так изи же, просто с "раскачкой" будет немного запарно.
2

-Это не баг, это фича
Скопировать ссылку
Чудо#4
Я не умею) Но вообще не сложно вроде. Роль и предметы, почти калька.
0
Делайте игру. Не форум.
Скопировать ссылку
Navedan#7
Flyer9431 (02 November 2014 - 01:52) писал: писал:
А есть в игре ограничение на максимальное количество денег в стаке?
Зависит от билда. В одном успешно упаковал 56к в одну пачку, в другом еле-еле унес 256 кредитов.
0

-Это не баг, это фича
Скопировать ссылку
Reaper9#12
Чудо (02 November 2014 - 01:49) писал: писал:
Я не умею) Но вообще не сложно вроде. Роль и предметы, почти калька.

Может этот быдлокод хоть как-то поможет.

Спойлер
/obj/item/device/alchemstone
name = "alchemy stone"
desc = "Strange stone."
icon = 'icons/obj/items.dmi'
icon_state = "alchstone"
item_state = "alchstone"
w_class = 2.0
var/exp=0//Опыт
var/level=0//Уровень


obj/item/device/alchemstone/proc/attack(obj/item/I as item, mob/user as mob)

if(istype(target,/obj/item) && !istype(target, /obj/item/weapon/disk/nuclear))

if(target,obj/item.w_class==1)
transform(I,user)

if(target,obj/item.w_class==2 && level>=1)
transform(I,user)

if(target,obj/item.w_class==3 && level>=2)
transform(I,user)

if(target,obj/item.w_class==4 && level>=3)
transform(I,user)


obj/item/device/alchemstone/proc/transform(obj/item/T as item, mob/user as mob)

if(T.w_class==1)
new /obj/item/weapon/spacecash/c1(src)
T.del()
addExp(1)
user << "Your transformed the [T] into money."
O.show_message("The [T] was transformed into money by [user]!", 1, "You see the [T] transforming into money.", 2)
if(T.w_class==2)
new /obj/item/weapon/spacecash/c10(src)
T.del()
addExp(10)

if(T.w_class==3)
new /obj/item/weapon/spacecash/c20(src)
T.del()
addExp(20)

if(T.w_class==4)
new /obj/item/weapon/spacecash/c50(src)
T.del()
addExp(50)


obj/item/device/alchemstone/proc/addExp(var/amount)
exp=exp+amount

if(exp==25 && level=0)
level=1
exp=0

if(exp>=250 && level<2)
level=2
exp=0

if(exp>=600 && level<3)
level=3
exp=0



Спойлер
else if (istype(W, /obj/item/device/alchemstone))

if(W.level>=6)
user << "You begin to transform the wall into money."

sleep(100)

if( !istype(src, /turf/simulated/wall) || !user || !W || !T ) return

if( user.loc == T && user.get_active_hand() == W )
user << "Your transformed the wall into money."
Del()
new /obj/item/weapon/spacecash/c200(src)
for(var/mob/O in viewers(user, 5))
O.show_message("The wall was transformed into money by [user]!", 1, "You see the wall transforming into money.", 2)
return

1
Скопировать ссылку
alkoz#14
Архетип хитрых и жадных жыдов слишком заезжен, ящитаю. У нас есть те же воксы и собственно, игроки, отыгрывающие одесситов.
0
Изображение
Спойлер
Скопировать ссылку
Osokorn#16
alkoz (02 November 2014 - 04:47) писал: писал:
У нас есть те же воксы
Вообще-то, обычно воксы первым делом хватают оружие и идут пиздить станцию. Если и стараются делать все ПА СТЕЛСУ!11, то всё равно в конце все сводится к мясу и птички огребают от ассистентов с боллонами, ну, или от щиткуритонов, откупоривших оружейку.
0
Изображение
Скопировать ссылку
BOGANET#19
А ещё там будут скафандры с ушками.
0
kartag (22 December 2013 - 14:07) писал: писал:
Они применяют слово "правила" вместо "законы". Они всерьёз употребляют слово "нормальный" и считают, что на станции кто-то кому-то что-то по умолчанию должен. Они всерьёз считают, что Азимов не обязывает ИИ сосать хуй у любого, кто это прикажет, и первый закон позволяет отказаться от выполнения любого приказа. А сами Азимова наверняка даже не читали.
This is why we can't have nice things.
Изображение
Скопировать ссылку
alkoz#20
Osokorn (02 November 2014 - 05:44) писал: писал:
Вообще-то, обычно воксы первым делом хватают оружие и идут пиздить станцию. Если и стараются делать все ПА СТЕЛСУ!11, то всё равно в конце все сводится к мясу и птички огребают от ассистентов с боллонами, ну, или от щиткуритонов, откупоривших оружейку.

И кто гарантирует, что в данном случае не будет то же самое?
0
Изображение
Спойлер
Скопировать ссылку
KAZMAP#21
alkoz (02 November 2014 - 08:41) писал: писал:
И кто гарантирует, что в данном случае не будет то же самое?
ОП же.
Или нет?
0
Изображение
Скопировать ссылку
Reaper9#23
Улучшенный код для камня.


Спойлер/obj/item/weapon/alchemstone
name = "alchemy stone"
desc = "Strange stone."
icon = 'icons/obj/items.dmi'
icon_state = "alchstone"
item_state = "alchstone"
w_class = 2.0
var/exp=0
var/level=0


obj/item/device/alchemstone/proc/attack(obj/item/I as item, mob/user as mob)
if(istype(target,/obj/item) && !istype(target, /obj/item/weapon/disk/nuclear) && !istype(target, /obj/item/weapon/alchemstone) && !istype(target, /obj/item/weapon/spacecash))
if(target,obj/item.w_class==1)
transform(I,user)
if(target,obj/item.w_class==2 && level>=1)
transform(I,user)
if(target,obj/item.w_class==3 && level>=2)
transform(I,user)
if(target,obj/item.w_class==4 && level>=3)
transform(I,user)


obj/item/device/alchemstone/proc/transform(obj/item/T as item, mob/user as mob)
if(T.w_class==1)
new /obj/item/weapon/spacecash/c1(src)
T.del()
addExp(1)
user << "Your transformed the [T] into money."
O.show_message("The [T] was transformed into money by [user]!", 1, "You see the [T] transforming into money.", 2)
if(T.w_class==2)
new /obj/item/weapon/spacecash/c10(src)
T.del()
addExp(10)
if(T.w_class==3)
new /obj/item/weapon/spacecash/c20(src)
T.del()
addExp(20)
if(T.w_class==4)
new /obj/item/weapon/spacecash/c50(src)
T.del()
addExp(50)


obj/item/device/alchemstone/proc/addExp(var/amount)
exp=exp+amount
if(exp==25)
level=1
if(exp>=250 && level<2)
level=2
if(exp>=600 && level<3)
level=3
if(exp>=250 && level<4)
level=4
if(exp>=250 && level<5)
level=5
if(exp>=250 && level<6)
level=6

Спойлерelse if (istype(W, /obj/item/weapon/alchemstone))
if(W.level>=6)
user << "<span class='notice'>You begin to transform the wall into money.</span>"
sleep(100)
if( !istype(src, /turf/simulated/wall) || !user || !W || !T ) return
if( user.loc == T && user.get_active_hand() == W )
user << "<span class='notice'>Your transformed the wall into money.</span>"
Del()
new /obj/item/weapon/spacecash/c200(src)
for(var/mob/O in viewers(user, 5))
O.show_message("<span class='warning'>The wall was transformed into money by [user]!</span>", 1, "<span class='warning'>You see the wall transforming into money.</span>", 2)
return

Спойлер/datum/game_mode
var/list/datum/mind/alchemists = list()


/datum/game_mode/alchemist
name = "alchemist"
config_tag = "alchemist"
restricted_jobs = list("Cyborg","AI")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain")
required_players = 0
required_enemies = 1
recommended_enemies = 4


uplink_welcome = "Syndicate Uplink Console:"
uplink_uses = 10


var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)


/datum/game_mode/alchemist/announce()
world << "<B>The current game mode is - Alchemist!</B>"
world << "<B>Some of the crewmembers are followers of Orde of The Alchemists of Singularity. Don't let them succeed!</B>"


/datum/game_mode/alchemist/pre_setup()
if(config.protect_roles_from_antagonist)
restricted_jobs += protected_jobs
var/list/possible_alchemists = get_players_for_role(BE_ALCHEMIST)
// stop setup if no possible alchemists
if(!possible_alchemists.len)
return 0
var/num_alchemists = 1
for(var/datum/mind/player in possible_alchemists)
for(var/job in restricted_jobs)
if(player.assigned_role == job)
possible_alchemists -= player
for(var/j = 0, j < num_alchemists, j++)
if (!possible_alchemists.len)
break
var/datum/mind/alchemist = pick(possible_alchemists)
alchemists += alchemist
alchemist.special_role = "alchemist"
possible_alchemists.Remove(alchemist)
if(!alchemists.len)
return 0
return 1


/datum/game_mode/alchemist/post_setup()
for(var/datum/mind/alchemist in alchemists)
if (!config.objectives_disabled)
forge_alchemists_objectives(alchemist)
spawn(rand(10,100))
finalize_alchemist(alchemist)
greet_alchemist(alchemist)
modePlayer += alchemists
spawn (rand(waittime_l, waittime_h))
send_intercept()
..()
return 1


/datum/game_mode/proc/forge_traitor_objectives(var/datum/mind/traitor)
if (config.objectives_disabled)
return

if(istype(traitor.current, /mob/living/silicon))
var/datum/objective/assassinate/kill_objective = new
kill_objective.owner = traitor
kill_objective.find_target()
traitor.objectives += kill_objective

var/datum/objective/survive/survive_objective = new
survive_objective.owner = traitor
traitor.objectives += survive_objective

if(prob(10))
var/datum/objective/block/block_objective = new
block_objective.owner = traitor
traitor.objectives += block_objective

else
switch(rand(1,100))
if(1 to 50)
var/datum/objective/assassinate/kill_objective = new
kill_objective.owner = alchemist
kill_objective.find_target()
alchemist.objectives += kill_objective
else
var/datum/objective/steal/steal_objective = new
steal_objective.owner = alchemist
steal_objective.find_alchemist()
alchemist.objectives += steal_objective
switch(rand(1,100))
if(1 to 100)
if (!(locate(/datum/objective/escape) in alchemist.objectives))
var/datum/objective/escape/escape_objective = new
escape_objective.owner = alchemist
alchemist.objectives += escape_objective
// if (!(locate(/datum/objective/upgrade_stone_objective) in alchemist.objectives))
// upgrade_stone_objective.owner = alchemist
// alchemist.objectives += upgrade_stone_objective
return


/datum/game_mode/proc/greet_alchemist(var/datum/mind/alchemist)
alchemist.current << "<B><font size=3 color=red>You are member of the Order of the Alchemists of Singularity .</font></B>"
if (!config.objectives_disabled)
var/obj_count = 1
for(var/datum/objective/objective in alchemist.objectives)
alchemist.current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
obj_count++
else
alchemist.current << "<i>You have been selected this round as an antagonist- <font color=blue>Within the rules,</font> try to act as an opposing force to the crew- This can be via corporate payoff, personal motives, or maybe just being a dick. Further RP and try to make sure other players have </i>fun<i>! If you are confused or at a loss, always adminhelp, and before taking extreme actions, please try to also contact the administration! Think through your actions and make the roleplay immersive! <b>Please remember all rules aside from those without explicit exceptions apply to antagonist.</i></b>"
return


/datum/game_mode/proc/finalize_alchemist(var/datum/mind/alchemist)
equip_alchemist(alchemist.current)
return


/datum/game_mode/alchemist/declare_completion()
..()
return


/datum/game_mode/alchemist/process()
// Make sure all objectives are processed regularly, so that objectives
// which can be checked mid-round are checked mid-round.
for(var/datum/mind/alchemist_mind in traitors)
for(var/datum/objective/objective in alchemist_mind.objectives)
objective.check_completion()
return 0


/datum/game_mode/proc/auto_declare_completion_alchemist()
if(alchemist.len)
var/text = "<FONT size = 2><B>The alchemists were:</B></FONT>"
for(var/datum/mind/alchemist in alchemists)
var/alchemistwin = 1

text += "<br>[alchemist.key] was [alchemist.name] ("
if(alchemist.current)
if(alchemist.current.stat == DEAD)
text += "died"
else
text += "survived"
if(alchemist.current.real_name != alchemist.name)
text += " as [alchemistr.current.real_name]"
else
text += "body destroyed"
text += ")"

if(alchemist.objectives.len)//If the alchemist had no objectives, don't need to process this.
var/count = 1
for(var/datum/objective/objective in alchemist.objectives)
if(objective.check_completion())
text += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='green'><B>Success!</B></font>"
feedback_add_details("alchemist_objective","[objective.type]|SUCCESS")
else
text += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='red'>Fail.</font>"
feedback_add_details("alchemistr_objective","[objective.type]|FAIL")
alchemistwin = 0
count++

var/special_role_text
if(alchemist.special_role)
special_role_text = lowertext(alchemist.special_role)
else
special_role_text = "antagonist"
if(!config.objectives_disabled)
if(alchemistwin)
text += "<br><font color='green'><B>The [special_role_text] was successful!</B></font>"
feedback_add_details("alchemist_success","SUCCESS")
else
text += "<br><font color='red'><B>The [special_role_text] has failed!</B></font>"
feedback_add_details("alchemist_success","FAIL")

world << text
return 1


/datum/game_mode/proc/equip_alchemist(mob/living/carbon/human/alchemist_mob, var/safety = 0)

if (!istype(alchemist_mob))
return
. = 1
if (alchemist_mob.mind)
if (alchemist_mob.mind.assigned_role == "Clown")
alchemist_mob << "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself."
alchemist_mob.mutations.Remove(CLUMSY)

var/obj/item/weapon/alchemstone/T = new(mob)
var/list/slots = list (
"backpack" = slot_in_backpack,
"left pocket" = slot_l_store,
"right pocket" = slot_r_store,
"left hand" = slot_l_hand,
"right hand" = slot_r_hand,
)
var/where = mob.equip_in_one_of_slots(T, slots)
if (!where)
mob << "Unfortunately, you weren't able to get an alchemy stone. This is very bad and you should adminhelp immediately."
else
mob << "You have an alchemy stone in your [where], one that will help you transform items into money."
mob.update_icons()
return 1

1
Скопировать ссылку
cdru#24
А protected_jobs что означает?
0
Изображение

Когда спрашивают: «Какое имя у школьника, что горит?» — Вы должны ответить: «Лёха Балабол»
Скопировать ссылку
Reaper9#25
cdru (03 November 2014 - 06:41) писал: писал:
А protected_jobs что означает?

Если в конфиге не закоментирована строка "PROTECT_ROLES_FROM_ANTAGONIST", то профессии из protected_jobs добавляются в restricted_jobs.
0
Скопировать ссылку

Обратно в Идеи