RU 📌 Pinned

Как сделать?

Dark[Ol(U23)leneri] #34 18.04.2010 22:57 6408 comments 2432001 views

Bup0H,
Что я увидел… Достаточно жесткую структуру, что у меня выпали глаза, надеюсь в кугене всё иначе.

Структура как в посте #4330 =) ну уезжает все когда сюда вставляешь

Aleks Versus Moderator 10.05.2016 07:22 (9 years ago)

Bup0H,
у тебя стоит cla перед тем, как вывести действие “уйти…”. Т.е. ты очищаешь список действий. Естественно, остаётся только одно действие. Если ты перенесёшь cla перед действием “разведать”, будут два действия: “разведать” и “посмотреть ещё”. Если же тебе нужно, чтобы действие “разведать” не появлялось, а появлялось первое действие “посмотреть ещё”, кое-что придётся переделать. В частности вытащить действия “посмотреть ещё” из действия “разведать” и определить переменную, по которой это действие будет появляться, как сделано с “уйти…”, например так:

Spoiler
if $args[0] = 'Баз1':
	if args[1]=0:
		act 'Разведать': 
			cla 
		'<center><img src="pic/baza1.jpg" ></center>' 
			minut += 5 
			stealth += 5 
			if stealth >= 20: 
				goto $curloc,$args[0],1
			else 
				$marker_escape='уйти' 
				goto $curloc,$args[0],1 
			end 
		end
	else
		cla	&	!	очищаем список действий, хотя в принципе при переходе на локацию, он и так очистится
		act 'Посмотреть еще': 
			*clr 
			cla 
			'<center><img src="pic/baza2.jpg" ></center>' 
			minut += 5 
			stealth +=5 
			if stealth >= 40: 
				act 'Посмотреть еще': 
					*clr 
					cla 
					'<center><img src="pic/baza3.jpg" ></center>' 
					minut += 5 
					stealth +=5 
					if stealth >= 60: 
						act 'Посмотреть еще': 
							*clr 
							cla 
							'<center><img src="pic/baza4.jpg" ></center>' 
							minut += 5 
							stealth +=5 
							if stealth >= 80: 
								act 'Посмотреть еще': 
									*clr 
									cla 
									'<center><img src="pic/baza5.jpg" ></center>' 
									minut += 5 
									stealth +=5 
								end 
							else 
								$marker_escape='уйти' 
								goto $curloc,$args[0],1 
							end 
						end 
					else 
						$marker_escape='уйти' 
						goto $curloc,$args[0],1 
					end 
				end 
			else 
				$marker_escape='уйти' 
				goto $curloc,$args[0],1  
			end 
		end 
		if $marker_escape='уйти': 
			act 'Уйти, меня могут заметить': 
				gt 'forest' 
			end 
		end
	end
end

P.S.^ Чтобы отступы не сбивались, вкладывай код в теги код на форуме - кнопка код . А если код длинный, то ещё и в спойлер.

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

Spoiler

if week >=1 and week <=6:
if hour >=6 and hour < 7 and minute >=0 and minute <10:
*nl ‘<a href=“exec:GT ‘‘лис_лес’’”>Лисенок</a> направляется в лес’
elseif hour >=6 and hour < 7 and minute >=55:
*nl ‘<a href=“exec:GT ‘‘лис_дом’’”>Лисенок</a> направляется в дом’
end
end

и соответственно в каждой локации в зависимости от того что лис делает свои действия, в одной к примеру проверить что несет, в другой проследить… и т.д В ричарде непонятно то, что много лишнего (сильно путает) календарь и время у меня все на одной локации ‘время’

Это не ответ на ваш вопрос. Просто мне эти условия… не нравятся. Нет, в них нет ошибок. Просто не нравятся.

Смотрите сами.
[*] Переменная week может принимать значения от 1 до 7. Зачем тогда писать проверку week >= 1? Она всегда будет истинна. Проще записать одно условие: week <= 6 (человеческим языком: все дни недели, номер которых меньше либо равен 6). А если принять во внимание диапазон возможных значений week, то это выражение будет эквивалентно выражению week ! 7 (человеческим языком: не воскресенье).

[] Аналогичным образом выражение hour >=6 and hour < 7 эквивалентно выражению hour = 6. (Если не верите, то попробуйте найти другое *целое число, которое удовлетворит этому условию).

[*] Если у вас с кодом все в порядке, то minute никогда не будет отрицательным. Следовательно нет смысла городить проверку minute >= 0.

Spoiler

Если же у вас minute стало отрицательным, то вместо этого там должно стоять что-то подобное:

if minute < 0 : msg "Черт возьми, я индус, у меня минуты отрицательные!"

:)

Итак, ваш код чудесным образом сократился:

if week ! 7 and hour = 6: 
    if minute < 10: 
        *nl '<a href="exec:GT ''лис_лес''">Лисенок</a> направляется в лес' 
    elseif minute >= 55: 
        *nl '<a href="exec:GT ''лис_дом''">Нина</a> направляется в дом' 
    end 
end

P.S. Когда вы используете код чужой игры всегда помните, что даже если игра работает, это не значит, что в ней идеальный код. Подходите к нему критически и включайте мозг.

спс что указал на ошибки, но вопрос был в другом. Я знаю что можно движение NPC прописать на одной локации с указанием где они будут в какой время, мне вот это нужно

А в чем проблема? Используйте $ONNEWLOC.

if $CURLOC = 'двор' and week ! 7 and hour = 6: 
    if minute < 10: 
        *nl '<a href="exec:GT ''лис_лес''">Лисенок</a> направляется в лес' 
    elseif minute >= 55: 
        *nl '<a href="exec:GT ''лис_дом''">Нина</a> направляется в дом' 
    end 
end

Сделал, только проблема если на этой локации ждать, то НПС просто не уходит, а со временем и дублируется.
Все разобрался Спс

Подскажите, пожалуйста,как сделать так что-б локация была только одноразово посещаема ?
Или ,как сделать, что-б ,например, ключ можно было взять и использовать только один раз.

IF Ключ = 0:
'Старый, ржавый ключ Взять ключ?'

act 'Да':
	Ключ = 1
	ADDOBJ 'Ключ'
	GOTO $CURLOC
end
end

act 'Нет': gt 'Зеркало'
ACT 'Странная дверь':
if Ключ = 1:
        time += 1
        DELOBJ 'Ключ'
        gs 'calendar'
GT 'SD'
        
else 
*nl  'Дверь заперта- надо найти ключ, что-б ее открыть.'
END
end
ключ=0
ACT 'Открыть дверь':

GT 'sm'

Но, так как, ключ снова =0 то его опять можно взять из зеркала.Это можно как-то пофиксить ?

Слишком громоздко получается. Хотелось бы покороче, т.к и так хотел пару If добавть а тут вообще лес получается. Попробую что нить сам покумекать(

Aleks Versus Moderator 10.05.2016 16:47 (9 years ago)

Bup0H,
покумекай.)) Это правильно. Код действительно можно сократить, и в разы.

skunsss,
встрой проверку в само действие открывания двери. Т.е. сейчас ты проверяешь только наличие ключа, но это условие можно вложить в другое условие:

ACT 'Странная дверь':
  if был_за_странной_дверью = 0: 
     if Ключ = 1: 
        time += 1 
        DELOBJ 'Ключ' 
        gs 'calendar' 
        GT 'SD'      
     else 
        *nl  'Дверь заперта- надо найти ключ, что-б ее открыть.' 
     END
  else
     "Дверь расползается под пальцами, превращаясь в плоский набросок."
  end
end

а на локации “SD” пишешь:

был_за_странной_дверью = 1

Хочу сделать большую вариантность (хотя еще мало что умею). Ниже написанный код вроде бы работает вполне корректно. Но по структуре видно (про Pic1), что я его не грамотно написал, да и рандомность Pic2 и Pic3 после If A > 800 я ничего не придумал лучше. Как можно его изменить более правильно, при этом не увеличивая в размерах сильно?

B = rand (0,100)
if B => 50 and D = 1:
	if A < 500:
		'<center><img src="pic1.jpg" ></center>'
	end
	if A >= 500 and A < 800:
		'<center><img src="pic2.jpg" ></center>'
	end
	if A >= 800:
		C = rand (1,100)
		if C <= 30:
		'<center><img src="pic2.jpg" ></center>'
		else
		'<center><img src="pic3.jpg" ></center>'
		end
	end
else
	'<center><img src="pic1.jpg" ></center>'
end

act 'Уйти':
	gt '...'
end

Народ помогите новичку. Как сделать в бою что бы ход передавался?
ТО есть что бы ты ходишь одним персонажем(например воином). Сделал действие(например атаковал мечём) Потом ход(то есть панель вариантов действий меняется полностью) переходит к другому персонажу(например к Лекарю) уже им действуешь(например лечишь воина) и только потом отдаёшь ход противнику(панель действий меняется и появляется только одна кнопка “окончить ход”) и только после этого враг действует своими действиями?
вот код стандарной боёвки

if здоровье<=0: 
   'Вас убил <<$имя_врага>>.' 
   act 'Конец':gt 'смерть' 
 else 
   act 'Атаковать': 
     атака_текущая = атака+rand(0,4)
     'Вы нанесли <<$имя_врага>> урон <<атака_текущая>>.' 
     здоровье_врага=здоровье_врага-атака_текущая
     if здоровье_врага<=0: 
       'Вы убили <<$имя_врага>>.' 
       delact $selact 
       act 'Далее':gt $next 
       exit 
     end 
     атака_врага_текущая = атака_врага+rand(0,4)
     '<<$имя_врага>> нанёс урон <<атака_врага_текущая>>.' 
     здоровье=здоровье-атака_врага_текущая
     xgt $curloc 
   end 
 end

Меня смущяет xgt $curloc видимо именно он возвращяет всё к изначальному параметру “Атаковать”.

Bup0H, ловите и разбирайтесь в логике :)

Nimage = 1
if rand (0,-1) and D = 1: 
    if A >= 500 and A < 800: 
        Nimage = 2
    elseif A >= 800:
        if rand (1,10) <= 3: 
			Nimage = 2
        else 
			Nimage = 3
        end 
    end 
end 
'<center><img src="pic<<Nimage>>.jpg" ></center>'

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

Darvin432, пример ваш предполагает бой одного героя с одним противником. Точка. Пытаться его переделать под другое количество героев бессмысленно. Вы только усложните себе жизнь. Надо писать с нуля. Особенно, если вы хотите, чтобы состав героев менялся (другой напарник, не один, а больше напарников), то этот примитивный код вам не поможет.

Log in or Register to post comments.