Funkcja resetowania nie działa

0

Witam
Moduje pewną grę w uproszczonym języku C, w której występuje kopanie złota.
Złoto domyślnie można w tej grze kopać w nieskończoność. Chciałem dodać kod który będzie ograniczał to kopanie do 5 wydobyć dziennie.
Napisałem odpowiedni kod w skrypcie i dodałem punkty_zmęczenia oraz funkcję resetującą te punkty dnia następnego. W tej grze czas upływa w rytmie dobowym.

instance PC_Goldhacken_Addon_Hour(C_Info)
{
	npc = PC_Hero;
	nr = 2;
	condition = PC_Goldhacken_Addon_Hour_Condition;
	information = PC_Goldhacken_Addon_Hour_Info;
	permanent = TRUE;
	description = "Odłup trochę.";
};


func int PC_Goldhacken_Addon_Hour_Condition()
{
	if(PLAYER_MOBSI_PRODUCTION == MOBSI_GOLDHACKEN)
	
	
	{
		return TRUE;
	};
};


var int GoldCounter;

func void PC_Goldhacken_Addon_Hour_Info()
{
	

	var int CurrentChance;
	var int MultiNugget;


	if (punkty_zmeczenia >= 5)
	{
	PrintScreen("Na dzisiaj już wystarczy...",-1,-1,FONT_ScreenSmall,2);
	b_endproductiondialog();
	dzien_kopania = Wld_GetDay();
	}
	else
	{
	Learn_by_doing = Learn_by_doing + 1;
	if(Learn_by_doing == 10)
	{
		B_Upgrade_Hero_HackChance(2);
	}
	else if(Learn_by_doing == 20)
	{
		B_Upgrade_Hero_HackChance(3);
	}
	else if(Learn_by_doing == 30)
	{
		B_Upgrade_Hero_HackChance(5);
	}
	else if(Learn_by_doing == 45)
	{
		B_Upgrade_Hero_HackChance(7);
	}
	else if(Learn_by_doing == 65)
	{
		B_Upgrade_Hero_HackChance(10);
	}
	else if(Learn_by_doing == 85)
	{
		B_Upgrade_Hero_HackChance(12);
		Knows_Truemmerschlag = TRUE;
	};
	
	CurrentChance = Hlp_Random(100);
	MultiNugget = Hlp_Random(10);
	if(B_GoldMob_Bestimmung() == TRUE)
	{
		if(CurrentChance <= Hero_HackChance)
		{
			if((GoldCounter >= 20) && (MultiNugget >= 8))
			{
				CreateInvItems(hero,ItMi_GoldNugget_Addon,3);
				PrintScreen("Odpadły 3 samorodki złota!",-1,-1,FONT_ScreenSmall,2);
				Truemmer_Count = 0;
				punkty_zmeczenia = punkty_zmeczenia + 1;
				 
				
			}
			else if((GoldCounter >= 7) && (MultiNugget >= 5))
			{
				CreateInvItems(hero,ItMi_GoldNugget_Addon,2);
				PrintScreen("Odpadły 2 samorodki złota!",-1,-1,FONT_ScreenSmall,2);
				Truemmer_Count = 0;
				GoldCounter = GoldCounter + 1;
				punkty_zmeczenia = punkty_zmeczenia + 1;
				 
				
			}
			else
			{
				CreateInvItems(hero,ItMi_GoldNugget_Addon,1);
				PrintScreen("Odpadł 1 samorodek złota!",-1,-1,FONT_ScreenSmall,2);
				Truemmer_Count = 0;
				GoldCounter = GoldCounter + 1;
				punkty_zmeczenia = punkty_zmeczenia + 1;
				
				
			};
		}

Funkcja resetująca punkty zmęczenia (w domyśle, ponieważ resetuje je co sekundę za sprawą odświeżania co sekunde)

func void TICK_TOCK ()
{
	if (Wld_GetDay() > dzien_kopania)
	&& (punkty_zmeczenia >= 5)
	
	{
		punkty_zmeczenia = 0;
		
	};
};



Problem polega na tym, że gdy mamy w grze następny dzień to można znów kopać w nieskończoność. Ten warunek && (punkty_zmeczenia >= 5) w ogóle nie działa i funkcja jest cały czas wywoływana bo cały czas jest nowy dzień. Zależy mi na tym by punkty zmęczenia były resetowane dopiero gdy już wydobędziemy złoto 5 razy i nastąpi kolejny dzień.
Wld_GetDay () to funkcja powodująca upływanie dni w trybie dobowym.

0

A co zwraca ten Wld_GetDay? Może to nie zwraca dnia tylko jakiś dokładniejszy czas i przez to jest to zawsze większe od dzien_kopania'? Próbowałeś to debugować jakoś? Może zrobić printy` na ekran tych wartości i info kiedy jaka funkcja się wywołuje.

1

Powinno być coś w tym stylu (nie znam tego języka i użyłem zmiennych globalnych co uważam, za crap code, więc na pewno jest do poprawki):

var int lastDay = Wld_GetDay();

func bool isNextDay()
{
    return lastDay < Wld_GetDay();
}

func prepereForNewDay()
{
    lastDay = Wld_GetDay();
    punkty_zmeczenia = 0;
}

func void TICK_TOCK ()
{
    if (isNextDay())  {
        prepereForNewDay();
    };
    doWork();
};

Jak już nazywasz symbole po angielsku TO WSZYSTKIE!
Zresztą pisanie kodu po polsku, to bardzo zła praktyka im szybciej się oduczysz tym lepiej. Nawet jeśli będzie to koślawy angielski.
W branży w 90% przypadków pracuje się w międzynarodowych zespołach. Tylko w JanuszSoft ludzie piszą kod po polsku.

1

Wygląda na błąd logiczny. Ustawiasz/aktualizujesz dzien_kopania, gdy masz >=5 punktów zmęczenia, a w drugiej funkcji oczekujesz, że obecny dzień będzie różny od dzien_kopania. If w funkcji TIC_TOCK nigdy nie wykona kodu, zawsze jeden albo drugi warunek nie jest spełniony.
Według mnie powinieneś aktualizować zmienną dzien_kopania wtedy, kiedy faktycznie następuje kopanie i przyrastają punkty zmęczenia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1