Skocz do zawartości

H2S04

Użytkownicy
  • Postów

    47
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    2

Odpowiedzi opublikowane przez H2S04

  1. EDIT 2: Ogólnie, kamera się popsuła i zaczęła mi wywalać czarne pasy po bokach ekranu, więc po prostu zmodyfikowałem End Stepa, by przy wykryciu zmiany rozmiaru okna zmienił wielkość kamery oraz zmienił rozmiar, app_surface. Wszystko działa poprawnie, jednak dalej trzeba zmaksymalizować okno (GM na to nie pozwala, trzeba dodać plik dll który by to wykonał)

     

    EDIT: Dobra... Widzę gdzie jest problem... Gra uruchamia się w oknie, ale jest nie dopasowane do ekranu, po wciśnięciu dopasowania (wypełnienia jak kto woli :P) do ekranu (kwadracik), wszystko się naprawia -.-. Matko, a ja już 3 kamerę piszę... przynajmniej ją skróciłem o 3/4 :)

    z funkcją window_set_showborder(false); też wszystko się naprawia 😪

     

    Witajcie, mam problem z GUI, a mianowicie skalowanie... Otóż, na fullscreenie koordynaty rysowania oraz myszy się zgadzają, po wyłączeniu fullscreena pozycja myszy z GUI się nie zgadza... Nie ważne jakiej funkcji do ustalania wielkości Gui użyję, koordy się nie zgadzają.. (Próbowałem display_set_gui_size(Window_Width, Window_Height); // display_set_gui_size(window_get_width(),window_get_height()); // display_set_gui_size(view_wport[0], view_hport[0]); // teraz pytanie gdzie jest problem, szukam w google i nie mogę ogarnąć problemu)

     

    Kamerę tworzę bezpośrednio w roomie i w alarmie skaluję GUI.

     

    // create 
    Window_Width = 1920;
    Window_Height = 1080;
    Cam_Scale = 1;
    Cam_W = Window_Width / Cam_Scale;
    Cam_H = Window_Height / Cam_Scale;
    FullScreen = false;
    
    move = true;
    alarm[0] = 1;
    surface_resize(application_surface,Window_Width,Window_Height);
    window_set_size(Window_Width,Window_Height);
    window_center();
    view_enabled = true;
    view_visible[0] = true;
    
    view_xport[0] = 0;
    view_yport[0] = 0;
    view_wport[0] = Cam_W;
    view_hport[0] = Cam_H;
    
    view_camera[0] = camera_create_view(0, 0, view_wport[0], view_hport[0], 0, o_Player, -1, -1, Cam_W/2, Cam_H/2);
    camera_set_view_pos(view_camera[0],o_Player.x - (Cam_W/2),o_Player.y - (Cam_H / 2));
    
    
    
    
    alarm[0] = 1;
    
    
    
    
    
    //alarm 0
    x = o_Player.x;
    y = o_Player.y;
    if move{
    	if alarm[0] < 0{
    		alarm[0] = 1*room_speed;	
    	}
    }
    
    if FullScreen{
    	display_set_gui_maximize();
    	window_set_fullscreen(true);
    } else {
    	display_set_gui_size(view_wport[0], view_hport[0]);
    	window_set_fullscreen(false);
    }
    
    
    //clean up
    
    camera_destroy(view_camera[0]);
    
    
    
    
    

     

    Mysz jest na górze czerwonego kwadratu...

    1.png

    2.png

  2. Mam pytanie z innej beczki, otóż posiadam kod ekwipunku, czyli rysowanie slotów, oraz przenoszenie przedmiotów, łączenie ich itp. Jednak napisałem kod w DrawGui zamiast step, jak bardzo może wpłynąć to na grę? Oczywiście kod działa tylko po kliknięciu myszą oraz gdy EQ jest włączone. Pozdrawiam :D

     

    PS. Tak wiem, że kod powinienem przenieść do stepa, bo on obsługuje logikę gry i jest wykonywany co ilość klatek, a Draw jest do rysowania, bo wykonywany jest ciągle, jednak ciekawi mnie to, zanim napiszę kod od nowa przenosząc do StepEvent :P

  3. 41 minut temu, gnysek napisał:

    Pobaw sie z camera_apply(), który automatycznie zmienia offset surface do obecnej kamery, więc nie trzeba odejmować pozycji view od x i y obiektów.

     

    Inaczej mówiąc - normlanie na surface wszystko rysuje się tak, że lewy górny róg to 0,0, po użyciu camera_apply, lewy górny róg surface to jest lewy górny róg obecnego view :)

     

    Jeszcze taka podpowiedź: jak rysujesz na surface, to rób to w jednym obiekcie, np.

    with(granaty) {
    draw_self();
    }
    with(krew) {
    draw_self();
    }
    // i jeszcze inne rzeczy

    Tak, żeby, optymalnie jedno surface tylko raz miało

    surface_set_target

    Zaraz obczaję, problem jest taki, że przy with jak obiekt został zniszczony usuwało go z surface ale zaraz pokombinuję :D

     

    EDIT: Hmm wczesniej kombinowałem z camera_apply to nie chciało działać teraz dałem na początku drawu surface i działa ok :D jeden problem mniej jednak dalej przy with przy zniszczeniu obiektu draw na surface się niszczy :P

  4. Mam pytanie dotyczące surface podążającego za kamerą. Otóż rysując surface na powierzchni stałej (tj. jakiś koordynatach typu room_width room_height) rysowanie polega na rysowaniu na koordach danego obiektu, przy kamerze muszę odjąć view width/height by narysowało mi surface tam gdzie chce, i tutaj jest problem bo ile wszystko się rysuje, (przy obiekcie jak istnieje tego problemu nie ma bo pozycja obiektu jest stała więc rysowanie w with będzie ładnie działać z kamerą), narysowany surface podąża za kamerą zamiast być w miejscu rysowania... Jak można to naprawić bo skończyły mi się pomysły i nic nie wydukałem patrząc na forum yoyo. Pozdrawiam.

     

    ///SURFACE RYSUJE SIĘ W POSTACI
    Create: global.FloorSurafce = -1;
    
    Draw:
    
    var VW = camera_get_view_width(view_camera[0]),
    VH = camera_get_view_height(view_camera[0]),
    VX = camera_get_view_x(view_camera[0]),
    VY = camera_get_view_y(view_camera[0]);
    
    if (surface_exists(global.FloorSurf)){
    	
    	draw_surface(global.FloorSurf,VX,VY);
    	
    } else {
    	global.FloorSurf = surface_create(VW,VH);	
    }
    
    
    
    
    
    /// OBIEKT KTÓREGO SZCZĄTKI CHCĘ RYSOWAĆ
    
    Draw:
    
    if speed == 0{ // obiekt się porusza i zmniejsza prędkość lub zatrzymuje się na ścianie
    	if (surface_exists(global.FloorSurf)){
    		surface_set_target(global.FloorSurf);
    		draw_sprite_ext(sprite_index,image_index,x-camera_get_view_x(view_camera[0]),y-camera_get_view_y(view_camera[0]),image_xscale,image_yscale,image_angle,TPColor,image_alpha); // TPColor to wybranie koloru
    		surface_reset_target();
    	}
    }
    

     

    surfproblem.png

  5. W dniu 25.01.2022 o 09:51, gnysek napisał:

    To jest jakiś problem z kanałami alpha w takim razie. Spróbuj albo zaznaczyć opcję "premultiply alpha" lub "edge filtering". Ja np. mam problem z obrazkami robionymi w Affinity Designer, bo jak je skalujesz (bez względu na tryby), to dostają czarnej obwódki i "edge filtering" je naprawia.

     

    obraz.png

    Paaanie luksus teraz :D światła które na siebie nachodzą ładnie się zlewają :) Dzięki Gnysek! :D Zdrówka :P

     

     

    light2.png

  6. EDIT: Problem występuje przy blend mode bm_add... jak jest sam biały bm_substract, to nie ma tego problemu. Więc chyba po prostu wywalę tę linijkę i zamiast, żółtego światła będzie białe i tyle :P

     

     

    Właśnie próbowałem na różne sposoby, efekt byle jaki, i człowiek już nie wie jak to przykombinować, nawet uciąłem trochę gardient ale dalej widać linię, rysowanie w pętli for też daje ten sam efekt ?

  7. 35 minut temu, gnysek napisał:

    Ne bardzo rozumiem problem - moim zdaniem wygląda ok. Jeśli jednak jest jakiś problem, no to musisz poprawić ten gradient, tak, żeby tam gdzie się zdaje, że on się kończy, faktycznie się kończył, a nie miał jeszcze z 30-40 pikseli.

    Z matematycznego punktu widzenia zdaje się, że wyświetla się ok.

    Już zmniejszyłem, popatrz jak gradient na siebie nachodzi, jeśli chodzi o latarnie, widać zaokrąglenia, bawiłem się bmami ale efekty słabe, wygląda jak by rysowały się wszystkie na raz, bo światełko od pawnshopu ładnie nachodzi bo jest rysowane następne w kolejności, jeszcze jutro nadam im jakiś nr i spróbuję for narysować je po kolei, może coś to da, bo wygląda fajnie ale jednak te zaokrąglenia jakoś mnie w oczy bolą ?

  8. Pytanko co do surface... Mam Sprite 500x500 okrągłego gardientu na światełko, ale rysowanie surface nachodzi na siebie i nie wygląda to zbyt ładnie, co mogę z tym zrobić? 

     

    var VW = camera_get_view_width(view_camera[0]),
    VH = camera_get_view_height(view_camera[0]),
    VX = camera_get_view_x(view_camera[0]),
    VY = camera_get_view_y(view_camera[0]);
    
    if(surface_exists(global.Light_Surf)){
    surface_set_target(global.Light_Surf);
    //BlackAlpha
    draw_clear_alpha(c_black,0.8);
    
    			with(o_Light){
    				
    				gpu_set_blendmode(bm_subtract);
    				draw_sprite_ext(s_Light,0,x-VX,y-VY,0.5,0.5,0,c_white,1); // 
    				gpu_set_blendmode(bm_normal);
    				
    				gpu_set_blendmode(bm_add);
    				draw_sprite_ext(s_Light,0,x-VX,y-VY,0.5,0.5,0,c_yellow,0.15);
    				gpu_set_blendmode(bm_normal);
    				
    				draw_sprite_ext(s_RoadLight,0,x-VX,y-VY,1,1,image_angle,c_white,1);
    				
    				
    				}
    				
    				with(o_PawnShp){
    				
    				gpu_set_blendmode(bm_subtract);
    				draw_sprite_ext(s_Light,0,x-VX,y-VY,0.3,0.3,0,c_white,1);
    				gpu_set_blendmode(bm_normal);
    				
    				gpu_set_blendmode(bm_add);
    				draw_sprite_ext(s_Light,0,x-VX,y-VY,0.3,0.3,0,LightColor,0.15);
    				gpu_set_blendmode(bm_normal);
    				
    				draw_sprite_ext(s_PawnShop,image_index,x-VX,y-VY-8,1,1,180,c_white,1);
    				draw_sprite_ext(s_PawnShop,image_index,x-VX,y-VY+8,1,1,0,c_white,1);
    
    				}
    surface_reset_target();
    
    draw_surface(global.Light_Surf,VX,VY);
    
    } else { 	
    	global.Light_Surf = surface_create(VW,VH);
    }

     

    Surf.png

  9. EDIT: Po napisaniu inwentarza, nie idzie czasami podnieść obiektu bo fiksuje. Będę musiał napisać to od nowa -.- A jak nie będzie działać, to po prostu z tego zrezygnuje...

     

    Amount to po prostu zmienna, która przechowuje ilość. Przy stworzeniu obiektu jest to 1, bo jest jeden obiekt i tyle ma pobrać przy łączeniu się chyba, że po złączeniu ma więcej. Właśnie po napisaniu show_debug_message, pokazuje mi, że kod GoTo = True, się nie wykonuje, mimo, że timer działa... Zaraz napiszę wszystkie debugi i eytuję post dla wglądu.

     

    (czy mi się wydaje, czy timer dostaje szału? bo widzę po debugu, tu ma 30 tu nagle 17 tu nagle 30...)

    (Kurła, wszytko się rozwala tutaj, dlatego wrzucam debug do pliku tekstowego i tutaj kod, by nie walnąć posta na całą stronę, bo spoiler wszystko psuje, a nie chce robić śmietnika...)

     

    show_debug_message(" Start Step ");
    show_debug_message(" Nastepe if FindMultiple 2 == true");
    if FindMultiple2 == true{ // Aktywowanie szukania
    	show_debug_message(" If Find multiple2 == true ");
    var i, obj;
    show_debug_message(" Ustal var i, obj, ");
    show_debug_message(" start 'FOR' ");
    for (i = 0; i < instance_number(o_Wood); i++){
    	show_debug_message(" ustalanie obj[i] ");
    	show_debug_message(" [i] ="+string(i));
    	obj[i] = instance_find(o_Wood,i); // Ustalenie numeru szukanego obiektu
    	show_debug_message(" obj[i] ="+string(obj[i]));
    	show_debug_message(" Przejscie do szukania obiektu z iloscia (if obj[i].Amount >= AMount ");
    		if obj[i].Amount >= Amount{ // #1 Jezeli Ilosc w danym obiekcie jest wieksza lub rowna
    			show_debug_message(" Jezeli obiekt z iloscia > od mojej ilosci: obj[i].Amount, obj[:"+string(i)+"]."+string(obj[i].Amount));
    			FindMultiple2 = false; // Wylacz szukanie
    			show_debug_message(" Zmien FindMultiple z true na false ");
    			Mx = obj[i].x; // Pobierz x
    			show_debug_message(" ustal MX = obj[i].x  ");
    			My = obj[i].y; // Pobierz y
    			show_debug_message(" ustal My = obj[i].y ");
    			GoTo = true; // Wlacz ruch obiektu
    			show_debug_message(" GoTo = true ");
    			timer = 30; // ustaw timer na 30;
    			show_debug_message(" Ustaw timer na 30 ");
    			show_debug_message(" Koniec If Amount >= Amount ");
    		} else { show_debug_message(" Else ");
    			FindMultiple2 = true; // #1 Jeżeli nie to szukaj od nowa
    			show_debug_message(" FindMultiple = True // szukaj od nowa ");
    		}
    		show_debug_message(" Koniec For ");
       }
       show_debug_message(" Koniec Multiple2 == true ");
    }
    
    show_debug_message(" KONIEC SZUKANIA ");
    show_debug_message(" . ");
    show_debug_message(" . ");
    show_debug_message(" . ");
    show_debug_message(" Przejscie do GoTo = true // nastepna linijka powinna byc  jezeli GoTo = true ");
    if GoTo = true{ // Jeżeli ruch jest wlaczony
    	show_debug_message(" jezeli GoTo = True ");
    	show_debug_message(" Przejscie do obliczania odleglosci ");
    	if point_distance(x,y,Mx,My) > 10 and point_distance(x,y,Mx,My) < 250{ // Jezeli odleglosc od obiektu jest wieksza od 10 i mniejsza od 250
    		show_debug_message(" Jezeli odleglosc > 10 i < 250 ");
    		direction = point_direction(x,y,Mx,My); // obroc sie w jego strone
    		show_debug_message(" uslal dira  ");
    		speed = 20; // idz
    		show_debug_message(" ustal speed ");
    		show_debug_message(" Koniec GoTo = True ");
    	} else { show_debug_message("  ELSE  ");// jezeli nie  
    		show_debug_message(" Przejscie do point distance ");
    		if 	point_distance(x,y,Mx,My) <= 10 { // jezeli jest mniejsza od 10
    			show_debug_message(" Jezeli Point Distance < 10 ");
    			GoTo = false; // wylacz ruch
    			show_debug_message(" GoTo = false ");
    			speed = 0; // wylacz speed
    			show_debug_message(" speed = 0 ");
    			col = collision_circle(x,y,10,o_Wood,false,true); // ustal kolizje
    			show_debug_message(" Ustalam col= colision ");
    			show_debug_message(" Przejscie do Col ");
    			if col{ // jezeli jest kolizja
    				show_debug_message(" If Col ");
    				col.Amount += Amount; // dodaj do kolizji swoja ilosc
    				show_debug_message(" Pobierz ilosc i dodaj do col ");
    				Amount = 0; // ustal ja na wszelki wypadek na 0
    				show_debug_message(" Ulstal na 0  ");
    				instance_destroy();	// zniszcz sie
    				show_debug_message(" usun sie ");
    				show_debug_message(" kONIEC COL ");
    			}
    			show_debug_message(" KONIEC IF POINT DISTANCE ");
    		}
    		show_debug_message(" KONIEC ELSE ");
    	}
    	show_debug_message(" KONIEC GOTO przed nawiasem }");
    }
    show_debug_message(" KONIEC CALEGO KODU GO TO ");
    show_debug_message(" . ");
    show_debug_message(" . ");
    show_debug_message(" . ");
    // tutaj wiadomo ocb
    show_debug_message(" Przescie do timera ");
    if timer >= 0 {
    	show_debug_message(" Jezeli Timer >= 0 ");
    	show_debug_message(" Timer = "+string(timer));
    	timer -= 1;	
    	show_debug_message(" Odejmij -1 ");
    	show_debug_message(" koniec odejmowania timera ");
    } else { show_debug_message(" else // jezeli timer <= 0 ");
    	FindMultiple2 = true; show_debug_message(" szukaj obiektu // FindMultiple2 = true ");
    	show_debug_message(" koniec Else  ");
    }
    show_debug_message(" Koniec Timera ");
    show_debug_message(" KONIEC STEPU ");

     

     

    DEBUG MESSAGE.rtf

  10. Bry. Walczę z tym shitem, i już nie wiem ocb. WG debug_message omija mi Goto = true {...}... Ale po kolei. Chcę by itemki łączyły się jak np. w Graveyard Keeper, po prostu leciały do siebie, i zwiększały ilość. Poniekąd kod działa, jednak jest mały problem... Czasami obiekty są blisko siebie i nie chcą się połączyć, dopiero jak stworzę dwa lub trzy nowe i któreś się złączą, to w tedy reszta może się połączyć. Coś chyba pokićkałem w kodzie. Pozdrawiam :D 

     

    if FindMultiple2 == true{ // Aktywowanie szukania
    var i, obj;
    for (i = 0; i < instance_number(o_Wood); i++){
    	obj[i] = instance_find(o_Wood,i); // Ustalenie numeru szukanego obiektu
    		if obj[i].Amount >= Amount{ // #1 Jezeli Ilosc w danym obiekcie jest wieksza lub rowna
    			FindMultiple2 = false; // Wylacz szukanie
    			Mx = obj[i].x; // Pobierz x
    			My = obj[i].y; // Pobierz y
    			GoTo = true; // Wlacz ruch obiektu
    			timer = 30; // ustaw timer na 30;
    		} else {
    			FindMultiple2 = true; // #1 Jeżeli nie to szukaj od nowa
    		}
       }
    }
    
    if GoTo = true{ // Jeżeli ruch jest wlaczony
    
    	if point_distance(x,y,Mx,My) > 10 and point_distance(x,y,Mx,My) < 250{ // Jezeli odleglosc od obiektu jest wieksza od 10 i mniejsza od 250
    		direction = point_direction(x,y,Mx,My); // obroc sie w jego strone
    		speed = 20; // idz
    	} else { // jezeli nie 
    		if 	point_distance(x,y,Mx,My) <= 10 { // jezeli jest mniejsza od 10
    			GoTo = false; // wylacz ruch
    			speed = 0; // wylacz speed
    			col = collision_circle(x,y,10,o_Wood,false,true); // ustal kolizje
    			if col{ // jezeli jest kolizja
    				col.Amount += Amount; // dodaj do kolizji swoja ilosc
    				Amount = 0; // ustal ja na wszelki wypadek na 0
    				instance_destroy();	// zniszcz sie
    			}
    			
    		}
    	}
    }
    
    // tutaj wiadomo ocb
    if timer >= 0 {
    
    	timer -= 1;	
    
    } else {
    	FindMultiple2 = true;
    }

     

    Zrzut ekranu 2020-11-06 170426.png

  11. Mam taki fajny error. Czemu nie chce mi zmienić wielkości surface? Jak wpiszę liczby 1920 i 1080, odczytuje normalnie i działa, a jak chce odczytać z ini, to nie chce, nawet jak próbuję odczytać ini inną zmienną. OCB? Znalazłem, że multiplikacja ale dalej nie wiem ocb.

    
    ___________________________________________
    ############################################################################################
    FATAL ERROR in
    action number 1
    of Create Event
    for object o_controller:
    
    DoMul :: Execution Error
     at gml_Script_scr_camera (line 20) - surface_resize(application_surface,view_width*window_scale,view_height*window_scale);
    ############################################################################################
    --------------------------------------------------------------------------------------------
    stack frame is
    gml_Script_scr_camera (line 20)
    called from - gml_Object_o_controller_Create_0 (line 6) - scr_camera();
    Kod Kamery:
    ini_open("GameOptions.ini");
    view_width = ini_read_string("Resolution", "Width", 1920);
    view_height= ini_read_string("Resolution", "Height", 1080);
    ini_close(); //// TAK NIE DZIAŁA
    
    //view_width = 1920;   //// TAK DZIAŁA NORMALNIE
    //view_height = 1080;
    window_scale = 3;
    
    window_set_size(view_width,view_height);
    
    
    
    surface_resize(application_surface,view_width*window_scale,view_height*window_scale);
    if moenter = 3{ // Jak najedzimy na back button
    	if mouse_check_button_pressed(mb_left){
    		// ini file save
    		if resolution = 1{ // jeżeli wybrana jest 1 rozdzielczość
    			roomwid = 1920;
    			roomhei = 1080;
    		} else {
    			if resolution = 2{ // etc
    			roomwid = 1280;
    			roomhei = 720;
    		} else {
    			if resolution = 3{ // etc
    			roomwid = 1366;
    			roomhei = 768;
    		} else {
    			if resolution = 4{ // itp itd
    			roomwid = 1280;
    			roomhei = 960;
    		} else {
    			if resolution = 5{
    			roomwid = 1024;
    			roomhei = 768;
    		} else {
    			if resolution = 6{
    			roomwid = 800;
    			roomhei = 600;
    		}
    		}
    		}
    		}
    		}
    		}
    		
    		ini_open("GameOptions.ini");
    	//Keys
    		ini_write_string("Keys", "KeyUp", upkey); // nadpisujemy sobie keye
    		ini_write_string("Keys", "KeyDown", downkey);
    		ini_write_string("Keys", "KeyLeft", leftkey);
    		ini_write_string("Keys", "KeyRight", rightkey);
    		ini_write_string("Keys", "KeyDrop", dropkey);
    		ini_write_string("Keys", "KeyUse", usekey);
    		ini_write_string("Keys", "KeyGrenade", grenkey);
    		ini_write_string("Keys", "KeyExpMenu", expmenukey);
    		ini_write_string("Keys", "KeySprint", sprintkey);
    		ini_write_string("Keys", "KeyWalk", walkkey);
    	//Resolution
    		ini_write_string("Resolution", "Width", roomwid); // ustalam szerokośc room (w tym wypadku na resloution 1 czyli 1920x1080)
    		ini_write_string("Resolution", "Height", roomhei); // to samo z wysokością
    		ini_write_string("Resolution", "FullScreen", fullscreen); // i czy gra ma być odpalona w full screen
    		ini_close();
    		
    		options = false; // wyłączam rysowanie opcji
    	}

     

  12. Mam problem z tablicami, przerobiłem je trochę, by działać na samych tablicach i nie musieć ich nadpisywać, wcześniej wyciągałem je i nadpisywałem, ale postanowiłem skrócić kod, lecz teraz przy strzale lub przeładowaniu, wartości nie chcą wskoczyć. Strzelę nie pobierze ammo, i nie mogę znowu strzelić, gdy zmienię broń na łuk, ciągle stara się przeładować (autoreload, a ammo ustawione na 5), Draw rysuje się że magazynek pistoletu spada na 0 i wraca do 5, a amunicja z EQ, pobiera się normalnie . Co zrobiłem źle?

    EDIT: Naprawiłem problem strzelania, nie przyczaiłem, że alarm się nie wykona bo nie klikam przycisku...

    dodałem linijkę na dół kodu

     

    Czy kod się pierdzieli przez brak referencji? Zamiast zmieniać mi tablicę secweapon zmienia mi Weapon?
     

    
    CREATE:
    #region //Weapons
    #region //Secondray Weapons
    /* 
    secweapon[,0] = "Metal Made Pistol"; //Nazwa Broni
    secweapon[,1] = 0.3; //Szybkośc Strzelania * room_speed // 1 = 1sec;
    secweapon[,2] = 1.5; //Szybkość Przeładowania * room_Speed // 1 = 1sec;
    secweapon[,3] = 3; //Minimalna Penetracja Pancerza
    secweapon[,4] = 8; //Maksymalna Penetracja Pancerza
    secweapon[,5] = 2; //Typ Używanej Amunicji ////		9mm
    secweapon[,6] = 0; //Ilość Amunicji w Magazynku
    secweapon[,7] = 20; //Maksymalna Ilość Amunicji w Magazynku
    */
    
    
    secweapon[0,0] = "EMPTY"; //Nazwa Broni
    secweapon[0,1] = 0; //Szybkośc Strzelania * room_speed // 1 = 1sec;
    secweapon[0,2] = 0; //Szybkość Przeładowania * room_Speed // 1 = 1sec;
    secweapon[0,3] = 0; //Minimalna Penetracja Pancerza
    secweapon[0,4] = 0; //Maksymalna Penetracja Pancerza
    secweapon[0,5] = 0; //Typ Używanej Amunicji ////
    secweapon[0,6] = 0; //Ilość Amunicji w Magazynku
    secweapon[0,7] = 0; //Maksymalna Ilość Amunicji w Magazynku
    
    secweapon[1,0] = "Wood Made Pistol"; //Nazwa Broni
    secweapon[1,1] = 0.3; //Szybkośc Strzelania * room_speed // 1 = 1sec;
    secweapon[1,2] = 2; //Szybkość Przeładowania * room_Speed // 1 = 1sec;
    secweapon[1,3] = 3; //Minimalna Penetracja Pancerza
    secweapon[1,4] = 5; //Maksymalna Penetracja Pancerza
    secweapon[1,5] = 2; //Typ Używanej Amunicji ////		9mm
    secweapon[1,6] = 5; //Ilość Amunicji w Magazynku
    secweapon[1,7] = 15; //Maksymalna Ilość Amunicji w Magazynku
    
    secweapon[2,0] = "Metal Made Pistol"; //Nazwa Broni
    secweapon[2,1] = 0.3; //Szybkośc Strzelania * room_speed // 1 = 1sec;
    secweapon[2,2] = 1.8; //Szybkość Przeładowania * room_Speed // 1 = 1sec;
    secweapon[2,3] = 3; //Minimalna Penetracja Pancerza
    secweapon[2,4] = 8; //Maksymalna Penetracja Pancerza
    secweapon[2,5] = 2; //Typ Używanej Amunicji ////		9mm
    secweapon[2,6] = 0; //Ilość Amunicji w Magazynku
    secweapon[2,7] = 20; //Maksymalna Ilość Amunicji w Magazynku
    
    secweapon[3,0] = "Normal Pistol"; //Nazwa Broni
    secweapon[3,1] = 0.15; //Szybkośc Strzelania * room_speed // 1 = 1sec;
    secweapon[3,2] = 1.7; //Szybkość Przeładowania * room_Speed // 1 = 1sec;
    secweapon[3,3] = 5; //Minimalna Penetracja Pancerza
    secweapon[3,4] = 10; //Maksymalna Penetracja Pancerza
    secweapon[3,5] = 2; //Typ Używanej Amunicji ////		9mm
    secweapon[3,6] = 0; //Ilość Amunicji w Magazynku
    secweapon[3,7] = 25; //Maksymalna Ilość Amunicji w Magazynku
    
    secweapon[4,0] = "Better Pistol"; //Nazwa Broni
    secweapon[4,1] = 0.15; //Szybkośc Strzelania * room_speed // 1 = 1sec;
    secweapon[4,2] = 1.5; //Szybkość Przeładowania * room_Speed // 1 = 1sec;
    secweapon[4,3] = 7; //Minimalna Penetracja Pancerza
    secweapon[4,4] = 12; //Maksymalna Penetracja Pancerza
    secweapon[4,5] = 2; //Typ Używanej Amunicji ////		9mm
    secweapon[4,6] = 0; //Ilość Amunicji w Magazynku
    secweapon[4,7] = 30; //Maksymalna Ilość Amunicji w Magazynku
    
    secweapon[5,0] = "Police Pistol"; //Nazwa Broni
    secweapon[5,1] = 0.15; //Szybkośc Strzelania * room_speed // 1 = 1sec;
    secweapon[5,2] = 1.5; //Szybkość Przeładowania * room_Speed // 1 = 1sec;
    secweapon[5,3] = 8; //Minimalna Penetracja Pancerza
    secweapon[5,4] = 14; //Maksymalna Penetracja Pancerza
    secweapon[5,5] = 2; //Typ Używanej Amunicji ////		9mm
    secweapon[5,6] = 0; //Ilość Amunicji w Magazynku
    secweapon[5,7] = 25; //Maksymalna Ilość Amunicji w Magazynku
    
    secweapon[6,0] = "Special Forces Pistol"; //Nazwa Broni
    secweapon[6,1] = 0.15; //Szybkośc Strzelania * room_speed // 1 = 1sec;
    secweapon[6,2] = 1.5; //Szybkość Przeładowania * room_Speed // 1 = 1sec;
    secweapon[6,3] = 8; //Minimalna Penetracja Pancerza
    secweapon[6,4] = 18; //Maksymalna Penetracja Pancerza
    secweapon[6,5] = 3; //Typ Używanej Amunicji ////		5.56mm
    secweapon[6,6] = 0; //Ilość Amunicji w Magazynku
    secweapon[6,7] = 20; //Maksymalna Ilość Amunicji w Magazynku
    
    secweapon[7,0] = "Metal Made Pistol"; //Nazwa Broni
    secweapon[7,1] = 0.4; //Szybkośc Strzelania * room_speed // 1 = 1sec;
    secweapon[7,2] = 2; //Szybkość Przeładowania * room_Speed // 1 = 1sec;
    secweapon[7,3] = 15; //Minimalna Penetracja Pancerza
    secweapon[7,4] = 25; //Maksymalna Penetracja Pancerza
    secweapon[7,5] = 4; //Typ Używanej Amunicji ////		7.62mm
    secweapon[7,6] = 0; //Ilość Amunicji w Magazynku
    secweapon[7,7] = 10; //Maksymalna Ilość Amunicji w Magazynku
    
    #endregion
    
    #region //Primary Weapons
    /*
    primweapon[,0] = "Metal Made Pistol"; //Nazwa Broni
    primweapon[,1] = 0.3; //Szybkośc Strzelania * room_speed // 1 = 1sec;
    primweapon[,2] = 1.5; //Szybkość Przeładowania * room_Speed // 1 = 1sec;
    primweapon[,3] = 3; //Minimalna Penetracja Pancerza
    primweapon[,4] = 8; //Maksymalna Penetracja Pancerza
    primweapon[,5] = 2; //Typ Używanej Amunicji ////		
    primweapon[,6] = 0; //Ilość Amunicji w Magazynku
    primweapon[,7] = 20; //Maksymalna Ilość Amunicji w Magazynku
    */
    
    primweapon[0,0] = "EMPTY"; //Nazwa Broni
    primweapon[0,1] = 0; //Szybkośc Strzelania * room_speed // 1 = 1sec;
    primweapon[0,2] = 0; //Szybkość Przeładowania * room_Speed // 1 = 1sec;
    primweapon[0,3] = 0; //Minimalna Penetracja Pancerza
    primweapon[0,4] = 0; //Maksymalna Penetracja Pancerza
    primweapon[0,5] = 0; //Typ Używanej Amunicji ////
    primweapon[0,6] = 0; //Ilość Amunicji w Magazynku
    primweapon[0,7] = 0; //Maksymalna Ilość Amunicji w Magazynku
    
    primweapon[1,0] = "BOW"; //Nazwa Broni
    primweapon[1,1] = 1; //Szybkośc Strzelania * room_speed // 1 = 1sec;
    primweapon[1,2] = 1; //Szybkość Przeładowania * room_Speed // 1 = 1sec;
    primweapon[1,3] = 5; //Minimalna Penetracja Pancerza
    primweapon[1,4] = 15; //Maksymalna Penetracja Pancerza
    primweapon[1,5] = 1; //Typ Używanej Amunicji ////		Arrows
    primweapon[1,6] = 0; //Ilość Amunicji w Magazynku
    primweapon[1,7] = 1; //Maksymalna Ilość Amunicji w Magazynku
    
    primweapon[2,0] = "Small PM"; //Nazwa Broni
    primweapon[2,1] = 0.1; //Szybkośc Strzelania * room_speed // 1 = 1sec;
    primweapon[2,2] = 2; //Szybkość Przeładowania * room_Speed // 1 = 1sec;
    primweapon[2,3] = 5; //Minimalna Penetracja Pancerza
    primweapon[2,4] = 12; //Maksymalna Penetracja Pancerza
    primweapon[2,5] = 2; //Typ Używanej Amunicji ////		9mm
    primweapon[2,6] = 0; //Ilość Amunicji w Magazynku
    primweapon[2,7] = 30; //Maksymalna Ilość Amunicji w Magazynku
    
    primweapon[3,0] = "Rifle 74"; //Nazwa Broni
    primweapon[3,1] = 0.3; //Szybkośc Strzelania * room_speed // 1 = 1sec;
    primweapon[3,2] = 1.5; //Szybkość Przeładowania * room_Speed // 1 = 1sec;
    primweapon[3,3] = 3; //Minimalna Penetracja Pancerza
    primweapon[3,4] = 8; //Maksymalna Penetracja Pancerza
    primweapon[3,5] = 4; //Typ Używanej Amunicji ////		7.62mm
    primweapon[3,6] = 0; //Ilość Amunicji w Magazynku
    primweapon[3,7] = 30; //Maksymalna Ilość Amunicji w Magazynku
    
    #endregion
    
    #region //Special Weapons
    /*
    specweapon[,0] = "Metal Made Pistol"; //Nazwa Broni
    specweapon[,1] = 0.3; //Szybkośc Strzelania * room_speed // 1 = 1sec;
    specweapon[,2] = 1.5; //Szybkość Przeładowania * room_Speed // 1 = 1sec;
    specweapon[,3] = 3; //Minimalna Penetracja Pancerza
    specweapon[,4] = 8; //Maksymalna Penetracja Pancerza
    specweapon[,5] = 2; //Typ Używanej Amunicji ////		9mm
    specweapon[,6] = 0; //Ilość Amunicji w Magazynku
    specweapon[,7] = 20; //Maksymalna Ilość Amunicji w Magazynku
    */
    
    specweapon[0,0] = "EMPTY"; //Nazwa Broni
    specweapon[0,1] = 0; //Szybkośc Strzelania * room_speed // 1 = 1sec;
    specweapon[0,2] = 0; //Szybkość Przeładowania * room_Speed // 1 = 1sec;
    specweapon[0,3] = 0; //Minimalna Penetracja Pancerza
    specweapon[0,4] = 0; //Maksymalna Penetracja Pancerza
    specweapon[0,5] = 0; //Typ Używanej Amunicji ////
    specweapon[0,6] = 0; //Ilość Amunicji w Magazynku
    specweapon[0,7] = 0; //Maksymalna Ilość Amunicji w Magazynku
    
    specweapon[1,0] = "Wood Rifle"; //Nazwa Broni
    specweapon[1,1] = 1; //Szybkośc Strzelania * room_speed // 1 = 1sec;
    specweapon[1,2] = 2; //Szybkość Przeładowania * room_Speed // 1 = 1sec;
    specweapon[1,3] = 8; //Minimalna Penetracja Pancerza
    specweapon[1,4] = 25; //Maksymalna Penetracja Pancerza
    specweapon[1,5] = 3; //Typ Używanej Amunicji ////		9mm
    specweapon[1,6] = 0; //Ilość Amunicji w Magazynku
    specweapon[1,7] = 10; //Maksymalna Ilość Amunicji w Magazynku
    
    specweapon[2,0] = "Pipe Pump"; //Nazwa Broni
    specweapon[2,1] = 1; //Szybkośc Strzelania * room_speed // 1 = 1sec;
    specweapon[2,2] = 1; //Szybkość Przeładowania * room_Speed // 1 = 1sec;
    specweapon[2,3] = 3; //Minimalna Penetracja Pancerza
    specweapon[2,4] = 8; //Maksymalna Penetracja Pancerza
    specweapon[2,5] = 2; //Typ Używanej Amunicji ////		9mm
    specweapon[2,6] = 0; //Ilość Amunicji w Magazynku
    specweapon[2,7] = 5; //Maksymalna Ilość Amunicji w Magazynku
    
    #endregion
    
    
    #region //Ammunition
    /*
    ammunition[,0] = "EMPTY"; //Nazwa Amunicji
    ammunition[,1] = 0; //Ilość Posiadana
    ammunition[,2] = 0; //Max Ilość Posiadania
    ammunition[,3] = 0; //Penetracja
    ammunition[,4] = 0; //Minimalna Ilość DMG
    ammunition[,5] = 0; //Maksymalna Ilość DMG
    ammunition[,6] = 0; //Szybkość Pocisku
    */
    
    ammunition[0,0] = "EMPTY"; //Nazwa Amunicji
    ammunition[0,1] = 0; //Ilość Posiadana
    ammunition[0,2] = 0; //Max Ilość Posiadania
    ammunition[0,3] = 0; //Penetracja
    ammunition[0,4] = 0; //Minimalna Ilość DMG
    ammunition[0,5] = 0; //Maksymalna Ilość DMG
    ammunition[0,6] = 0; //Szybkość Pocisku
    
    ammunition[1,0] = "Arrows"; //Nazwa Amunicji
    ammunition[1,1] = 5; //Ilość Posiadana
    ammunition[1,2] = 50; //Max Ilość Posiadania
    ammunition[1,3] = 20; //Penetracja
    ammunition[1,4] = 10; //Minimalna Ilość DMG
    ammunition[1,5] = 25; //Maksymalna Ilość DMG
    ammunition[1,6] = 30; //Szybkość Pocisku
    
    ammunition[2,0] = "9mm"; //Nazwa Amunicji
    ammunition[2,1] = 50; //Ilość Posiadana
    ammunition[2,2] = 100; //Max Ilość Posiadania
    ammunition[2,3] = 5; //Penetracja
    ammunition[2,4] = 5; //Minimalna Ilość DMG
    ammunition[2,5] = 15; //Maksymalna Ilość DMG
    ammunition[2,6] = 50; //Szybkość Pocisku
    
    ammunition[3,0] = "5.56mm"; //Nazwa Amunicji
    ammunition[3,1] = 50; //Ilość Posiadana
    ammunition[3,2] = 100; //Max Ilość Posiadania
    ammunition[3,3] = 10; //Penetracja
    ammunition[3,4] = 10; //Minimalna Ilość DMG
    ammunition[3,5] = 20; //Maksymalna Ilość DMG
    ammunition[3,6] = 60; //Szybkość Pocisku
    
    ammunition[4,0] = "7.62mm"; //Nazwa Amunicji
    ammunition[4,1] = 50; //Ilość Posiadana
    ammunition[4,2] = 100; //Max Ilość Posiadania
    ammunition[4,3] = 15; //Penetracja
    ammunition[4,4] = 15; //Minimalna Ilość DMG
    ammunition[4,5] = 30; //Maksymalna Ilość DMG
    ammunition[4,6] = 70; //Szybkość Pocisku
    
    ammunition[5,0] = "Shotgun Shell"; //Nazwa Amunicji
    ammunition[5,1] = 10; //Ilość Posiadana
    ammunition[5,2] = 100; //Max Ilość Posiadania
    ammunition[5,3] = 5; //Penetracja
    ammunition[5,4] = 5; //Minimalna Ilość DMG
    ammunition[5,5] = 15; //Maksymalna Ilość DMG
    ammunition[5,6] = 30; //Szybkość Pocisku
    
    #endregion
    
    canshot = true; //Mogę Strzelać
    canuneq = true; // Mogę Wyrzucić Broń
    
    Weapon = secweapon;		//Wybieranie Tablicy secweapon, primweapon, specweapon
    SecSlot = 1;			//Slot Broni 1 = Secondary
    PrimSlot = 1;			//Slot Broni 2 = Primary
    SpecSlot = 0;			//Slot Broni 3 = Special
    ActualSlot = 0;			//Aktualnie używany slot; 0 = Sceondary, 1 = Primary, 2 = Special
    WeaponSlot = 0;			//Broń W Danym Slocie
    WeaponName = "";		//Nazwa Broni
    ReloadSpeed = 0;		//Czas Przeładowania Broni;
    ReloadSpeedMax = 0;		//Czas Przeładowania Broni Max;
    ShotSpeed = 0;			//Szybkość Strzelania;
    ActualAmmo = 0;			//Aktualnie przypisana Amunicja
    WeaponSprite = 0;		//Rysowanie Sprita broni
    WeaponIndex = 0;		//Image_Index Sprite Broni
    MaxWeaponAmmo = 0;		//Maxymalna ilość ammo w broni (maxmag);
    WeaponMinArmorPen = 0;	//Minimalna Penetracja Panerza
    WeaponMaxArmorPen = 0;	//Maksymalna Penetracja Pancerza
    AmmoPenetration = 0;	//Penetracja Ammunicji
    MinAmmoDMG = 0;			//Min DMG Amunicji
    MaxAmmoDMG = 0;			//Max DMG Amunicji
    MaxEqAmmo = 0;			//Max Ammo w EQ
    AmmoName = "";			//Nazwa Amunicji
    AmmoSpeed = 0;			//Szybkosc Amunicji
    sspd = 0;				//Timer Strzelania
    rspeed = 0;				//Timer Reloadu
    canreload = true;
    reload = false;
    reloadend = false;
    
    
    recoil = 0; // Recoil Broni
    moverecoilend = 0; // Końcowy Recoil
    moverecoil = 0; //Recoil Podczas ruchu 0 = Stoje, 1 = Idę, 2 = Bignę, 3 = Sprintuję;
    
    
    
    dmg = 0;
    ap = 0;
    alldmg = 0;
    
    STEP:
    
    if global.pausegame == false && myDead == false{
    
    //Wybieranie Slotu Broni
    if reload == false{
    if keyboard_check_pressed(ord("1")){
    	ActualSlot = 0;
    }
    if keyboard_check_pressed(ord("2")){
    	ActualSlot = 1;
    }
    if keyboard_check_pressed(ord("3")){
    	ActualSlot = 2;
    }
    }
    
    //Wybieranie Broni
    if (ActualSlot == 0)
    {
    	//Przypisanie warotści których nie trzeba nadpisywać
    	Weapon = secweapon;
    	WeaponSlot = SecSlot;							//Przypisanie broni do slotu;
    	WeaponSprite = 1;								//Przypisanie Sprite Broni 1 = s_SceWeaponSprite
    } else {
    	if (ActualSlot == 1)
    	{
    		Weapon = primweapon;
    		WeaponSlot = PrimSlot;							//Przypisanie broni do slotu;
    		WeaponSprite = 2;
    	} else {
    		if (ActualSlot == 2)
    		{
    			Weapon = specweapon;
    			WeaponSlot = SpecSlot;							//Przypisanie broni do slotu;
    			WeaponSprite = 3;
    		}
    	}
    }
    
    /* 
    secweapon[,0] = "Metal Made Pistol"; //Nazwa Broni
    secweapon[,1] = 0.3; //Szybkośc Strzelania * room_speed // 1 = 1sec;
    secweapon[,2] = 1.5; //Szybkość Przeładowania * room_Speed // 1 = 1sec;
    secweapon[,3] = 3; //Minimalna Penetracja Pancerza
    secweapon[,4] = 8; //Maksymalna Penetracja Pancerza
    secweapon[,5] = 2; //Typ Używanej Amunicji ////		9mm
    secweapon[,6] = 0; //Ilość Amunicji w Magazynku
    secweapon[,7] = 20; //Maksymalna Ilość Amunicji w Magazynku
    
    ammunition[,0] = "EMPTY"; //Nazwa Amunicji
    ammunition[,1] = 0; //Ilość Posiadana
    ammunition[,2] = 0; //Max Ilość Posiadania
    ammunition[,3] = 0; //Penetracja
    ammunition[,4] = 0; //Minimalna Ilość DMG
    ammunition[,5] = 0; //Maksymalna Ilość DMG
    ammunition[,6] = 0; //Szybkość Pocisku
    */
    
    	ActualAmmo = Weapon[WeaponSlot,5];					//Przypisanie typu ammunicji;
    	ReloadSpeed = Weapon[WeaponSlot,2]*room_speed;		//Przypisanie szybkości przeładowania;
    	ReloadSpeedMax = Weapon[WeaponSlot,2]*room_speed;	//Przypisanie Maxymalnej szybkości przeładowania;
    	ShotSpeed = Weapon[WeaponSlot,1];					//Przypisanie szybkości strzelania;
    	WeaponName = Weapon[WeaponSlot,0];					//Przypisanie Nazwy Broni
    	MaxWeaponAmmo = Weapon[WeaponSlot,7];				//Przypisanie Maksymalnej ilości Ammo w Broni
    	WeaponMinArmorPen = Weapon[WeaponSlot,3];			//Przypisanie Minimalnej Penetracji Pocisku Przez Broń
    	WeaponMaxArmorPen = Weapon[WeaponSlot,4];			//Przypisanie Maksymalnej Penetracji Pocisku Przez Broń
    	WeaponIndex = WeaponSlot;							//Przypisanie Indexu Sprite Broni
    	
    	MinAmmoDMG = ammunition[ActualAmmo,4];				//Przypisanie Minimalnego DMG z Amunicji
    	MaxAmmoDMG = ammunition[ActualAmmo,5];				//Przypisanie Maksymalnego DMG z Amunicji
    	AmmoPenetration = ammunition[ActualAmmo,3];			//Pryzpisanie Penetracji Pancerza z Amunicji
    	MaxEqAmmo = ammunition[ActualAmmo,2];				//Przypisanie Maksymalnej ilości Ammo w EQ
    	AmmoName = ammunition[ActualAmmo,0];				//Przypisanie Nazwy Amunicji
    	AmmoSpeed = ammunition[ActualAmmo,6];
    	
    #region // LOSOWANIE SZANSY NA TRAFIENIE DANEJ CZĘŚCI CIAŁA PATRZĄC NA PROSZUANIE SIĘ POSTACI
    if movement == true{
    	if imwalk == true{ // jezeli ide na shift
    		headproc = 60;
    		torsproc = 30;
    		armproc = 20;
    		legproc = 10;
    		missproc = 0;
    	}
    	
    	if imrun == true { // jezeli sprintuje
    		headproc = 97;
    		torsproc = 70;
    		armproc = 50;
    		legproc = 40;
    		missproc = 0;
    	}
    	
    	if imrunn == true{ // jezeli truchtam
    		headproc = 80;
    		torsproc = 55;
    		armproc = 40;
    		legproc = 20;
    		missproc = 0;
    	}
    } else {  // jezeli stoje
    		headproc = 50;
    		torsproc = 25;
    		armproc = 15;
    		legproc = 5;
    		missproc = 0;
    }
    
    	randomize() // upewniamy się że seed będzie losowy i da losowe wyniki
    	procent = irandom(100);
    	
    	//Zawsze domyślnie nie trafisz
    bodyshot = 6;
    
    //Ale jesli procent bedzie dobry to trafisz przynajmniej to
    if procent > legproc { //wieksze od 10
    	bodyshot = round(irandom_range(4,5));
    }
    
    //A jak bedzie lepszy to już to trafisz.
    if procent > armproc { //wieksze od 25
    	bodyshot = round(irandom_range(2,3));
    	//Ten warunek jak się spełni to nadpisze poprzednią zmianę "bodyshot" więc nie musisz się martwić o sprawdzanie Min-max
    }
    
    if procent > torsproc { //wieksze od 30
    	bodyshot = 1;
    }
    
    if procent > headproc { //wieksze od 90
    	bodyshot = 0;
    }
    
    #endregion
    //recoil = 0; // recoil
    //moverecoilmin = -1; // zmieniajaca wartosc na -
    //moverecoilend = 0; // koncowy recoil
    //moverecoil = 0; // stan recoilu = 0, jak stoi, 1 jak idzie, 2 jak truchta, 3 jak biegnie;
    recoil = random_range(-5,5);
    moverecoilend = (moverecoil * recoil) / global.recoilskill;
    
    dmg = round(irandom_range(MinAmmoDMG,MaxAmmoDMG));
    ap = round(irandom_range(WeaponMinArmorPen,WeaponMaxArmorPen));
    
    if global.expmenu == false
    {
    	
    #region	//SHOT CODE
    
    		if mouse_check_button(mb_left)
    		{
    			if canshot == true && reload == false
    			{
    				if global.UnAmmo == false
    				{
    					if Weapon[WeaponSlot,6] > 0
    					{
    						canshot = false;
    						alldmg = ((dmg + ap) + AmmoPenetration);
    						if WeaponName = "BOW"{
    							inst = instance_create_layer(x,y,"Instances",o_arrow);
    							inst.speed = AmmoSpeed;
    							inst.spdd = AmmoSpeed;
    							inst.direction = direction;
    							inst.image_angle = direction;
    							inst.ap = ap;
    							inst.dmg = alldmg;
    							inst.bshot = bodyshot;
    							global.lastdmg = alldmg;
    							sspd = ShotSpeed;
    							Weapon[WeaponSlot,6] -= 1;	
    						} else {
    							shel = instance_create_layer(x,y,"Instances",o_shell);
    							inst = instance_create_layer(x,y,"Instances",o_bullet);
    							inst.speed = AmmoSpeed;
    							inst.spdd = AmmoSpeed;
    							inst.direction = direction + moverecoilend;
    							inst.image_angle = direction + + moverecoilend;
    							inst.ap = ap;
    							inst.dmg = alldmg;
    							inst.bshot = bodyshot;
    							sspd = ShotSpeed;
    							Weapon[WeaponSlot,6] -= 1;
    						}
    					}
    				} else {
    					//if global unammo = true	
    					canshot = false;
    						alldmg = ((dmg + ap) + AmmoPenetration);
    						if WeaponName = "BOW"{
    							inst = instance_create_layer(x,y,"Instances",o_arrow);
    							inst.speed = AmmoSpeed;
    							inst.spdd = AmmoSpeed;
    							inst.direction = direction;
    							inst.image_angle = direction;
    							inst.ap = ap;
    							inst.dmg = alldmg;
    							inst.bshot = bodyshot;
    							global.lastdmg = alldmg;
    							sspd = ShotSpeed;	
    						} else {
    							shel = instance_create_layer(x,y,"Instances",o_shell);
    							inst = instance_create_layer(x,y,"Instances",o_bullet);
    							inst.speed = AmmoSpeed;
    							inst.spdd = AmmoSpeed;
    							inst.direction = direction + moverecoilend;
    							inst.image_angle = direction + + moverecoilend;
    							inst.ap = ap;
    							inst.dmg = alldmg;
    							inst.bshot = bodyshot;
    							sspd = ShotSpeed;
    						}
    				}
    			}
    		}
    
    	if canshot = false && reload = false{
    		if sspd > 0{
    			sspd -= 1;	
    		} else {
    			canshot = true;	
    		}
    
    #endregion
    
    #region	//RELOAD CODE
    
    /* 
    secweapon[0,0] = "Metal Made Pistol"; //Nazwa Broni
    secweapon[0,1] = 0.3; //Szybkośc Strzelania * room_speed // 1 = 1sec;
    secweapon[0,2] = 1.5; //Szybkość Przeładowania * room_Speed // 1 = 1sec;
    secweapon[0,3] = 3; //Minimalna Penetracja Pancerza
    secweapon[0,4] = 8; //Maksymalna Penetracja Pancerza
    secweapon[0,5] = 2; //Typ Używanej Amunicji ////		9mm
    secweapon[0,6] = 0; //Ilość Amunicji w Magazynku
    secweapon[0,7] = 20; //Maksymalna Ilość Amunicji w Magazynku
    
    ammunition[0,0] = "EMPTY"; //Nazwa Amunicji
    ammunition[0,1] = 0; //Ilość Posiadana
    ammunition[0,2] = 0; //Max Ilość Posiadania
    ammunition[0,3] = 0; //Penetracja
    ammunition[0,4] = 0; //Minimalna Ilość DMG
    ammunition[0,5] = 0; //Maksymalna Ilość DMG
    ammunition[,6] = 0; //Szybkość Pocisku
    */
    
    
    if (WeaponName = "BOW") // JEZE BRON TO ŁUK
    {
    	if (canreload == true)
    	{ // JEZELI MOGĘ PRZEŁADOWAĆ
    		if ((Weapon[WeaponSlot,6] < MaxWeaponAmmo) && (ammunition[ActualAmmo,1] > 0)) // JEŻELI AMMO JEST MNIEJSZE OD MAX AMMO I EQ AMMO JEST WIEKSZE OD 0
    		{
    			canshot = false; // NIE MOGE STRZELIC
    			canreload = false; // NIE MOGE PRZELADOWAC
    			reload = true; // PRZELADOWANIE
    			rspeed = ReloadSpeed; // SZYBKOSC PRZELADOWANIA
    		}
    	}
    } else { // JEZELI NIE JEST LUKIEM
    	if keyboard_check_pressed(ord("R"))
    	{
    		if (canreload == true){
    			if (ammunition[ActualAmmo,1] > 0)
    			{
    				if (Weapon[WeaponSlot,6] < MaxWeaponAmmo)
    				{
    					canshot = false;
    					canreload = false;
    					reload = true;
    					rspeed = ReloadSpeed;
    					var mage;
    					mage = instance_create_layer(x,y,"Instances",o_Mag);
    					mage.mag = ActualAmmo;
    				}
    			}
    		}
    	}
    }
    
    if reload == true
    {
    	show_debug_message("PRZELADOWYWUJE");
    	show_debug_message("rspeed: "+string(rspeed));
    	if rspeed > 0{
    		rspeed -= 1;
    		show_debug_message("rspeed -= 1");
    		show_debug_message("rspeed: "+string(rspeed));
    	} else {
    		reloadend = true;
    		show_debug_message("rspeed: "+string(rspeed));
    		show_debug_message("END RELOAD");
    	}
    }
    
    if reloadend == true
    {
    	show_debug_message("RELOAD END = TRUE");
    	/* 
    secweapon[0,0] = "Metal Made Pistol"; //Nazwa Broni
    secweapon[0,1] = 0.3; //Szybkośc Strzelania * room_speed // 1 = 1sec;
    secweapon[0,2] = 1.5; //Szybkość Przeładowania * room_Speed // 1 = 1sec;
    secweapon[0,3] = 3; //Minimalna Penetracja Pancerza
    secweapon[0,4] = 8; //Maksymalna Penetracja Pancerza
    secweapon[0,5] = 2; //Typ Używanej Amunicji ////		9mm
    secweapon[0,6] = 0; //Ilość Amunicji w Magazynku
    secweapon[0,7] = 20; //Maksymalna Ilość Amunicji w Magazynku
    
    ammunition[0,0] = "EMPTY"; //Nazwa Amunicji
    ammunition[0,1] = 0; //Ilość Posiadana
    ammunition[0,2] = 0; //Max Ilość Posiadania
    ammunition[0,3] = 0; //Penetracja
    ammunition[0,4] = 0; //Minimalna Ilość DMG
    ammunition[0,5] = 0; //Maksymalna Ilość DMG
    ammunition[,6] = 0; //Szybkość Pocisku
    */
    	var a;
    	a = MaxWeaponAmmo - Weapon[WeaponSlot,6]; // a = maxammo (30) - ammo w magazynku (25) == 5 ammo do doadania;
    	show_debug_message("A = "+string(a));
    	if ammunition[ActualAmmo,1] > a
    	{ // jeżeli ammo w eq jest wieksze od a(5) teraz jest 100 wiec jest wieksze 100 > 5
    		show_debug_message("Ilosc ammo > a");
    		Weapon[WeaponSlot,6] += a; // dodaj 5 ammo
    		show_debug_message("DODAJ AMMO DO MAG");
    		ammunition[ActualAmmo,1] -= a; // odejmij 5 ammo
    		show_debug_message("ODEJMIJ AMMO Z EQ");
    	} else { // jeżeli ammo w eq jest mniejsze od a(5) (np 3) dodaj reszte naboi z eq
    		Weapon[WeaponSlot,6] += ammunition[ActualAmmo,1];
    		show_debug_message("DODAJRESZTE AMMO");
    		ammunition[ActualAmmo,1] = 0;
    		show_debug_message("USTAWIA EQAMMO NA 0");
    	}
    		
    	
    	reloadend = false;
    	show_debug_message("RELOAD END = FALSE");
    	reload = false;
    	show_debug_message("RELOAD = FALSE");
    	canreload = true;
    	show_debug_message("CANRELOAD = TRUE");
    	canshot = true;	
    	show_debug_message("CANSHOT = TRUE");
    }
    #endregion
    
    #endregion
    } //global.Expmenu == false;   end
    } //global.pausegame = false && mydead == false;  end

     

  13. Wróciłem i jak zwykle mam pytanie. Otóż wiem jak się liczy procenty ale nie wiem jak mam to wykorzystać.

    Jak napisać kod, który daje mi np 100-90% szans, że trafię w głowę, 90-75 % szans, że trafię w tors, 75-45% szans, że trafię w rękę, 45-20% szans, że trafię w nogę i 20-0%, że nie trafię w ogóle. Napisałem coś takiego bez procentów, ale nie działa poprawnie, bo losowanie liczby to dalej losowanie :/ 

    
    
    step postaci:
    
    if imwalk == true{ // jeżeli idę
            maxhead = 100;
            minhead = 90;
            maxtorso = 90;
            mintorso = 30;
            maxarm = 30;
            minarm = 25;
            maxleg = 25;
            minleg = 10;
            maxmiss = 10;
            minmiss = 0;
        }
    
    
    
    create pocisku:
    
    var tt = irandom(1.1);
    procent = lerp(0,100,tt);
    
    
    
    step pocisku:
    
                    if procent > minhead && procent < maxhead{
                        bodyshot = 0;
                    } else {
                        if procent > mintorso && procent < maxtorso{
                            bodyshot = 1;    
                        } else {
                            if procent > minarm && procent < maxarm{
                                bodyshot = round(irandom_range(2,3));    
                            } else {
                                if procent > minleg && procent < maxleg{
                                    bodyshot = round(irandom_range(4,5));    
                                } else {
                                    if procent > minmiss && procent < maxmiss{
                                        bodyshot = 6;    
                                }
                            }
                        }
                    }

     

  14. Tak znowu ja, tak dalej mam pierdołę :P
    GMS 2!

     

    W Create mam tablicę dwuwymiarową broni,

    weapon[1,1] = 20 //Posiadana ilość amunicji

    W stepie wpisałem kod

    ammo = weapon[weaponh,1]

    gdzie weaponh jest aktualnie wybraną bronią i tutaj zaczynają się cuda... (w GMS zawsze działało to normalnie)

    w Evencie Global Mosue Left Down po wpisaniu na próbę ammo -= 1; nie ma reakcji... totalne 0 (mam debugowanie na draw'ach więc widzę czy ubywa czy nie)

    Po stworzeniu w stepie kodu:

    if mouse_check_button(mb_left){
        if weaponh > 0{
            if ammo > 0 {
                ammo -= 1;    
            }
        }
    }

    Amunicji ubywa po naciśnięciu i trzymaniu LPM tylko o 1, po puszczeniu wraca do poziomu 20, siedzę myślę i dalej nie wiem co zrobiłem źle, a jak zrobiłem to pewnie jakąś pierdołę, której nie widzę :/

    CREATE:
    
    //    SECONDARY //
    
    weapon[1,0] = true; // Have Weapon
    weapon[1,1] = 20; // Ammo
    weapon[1,2] = 20; // Max Ammo
    weapon[1,3] = 2; // Mag
    weapon[1,4] = 3; // Max Mag
    weapon[1,5] = 1; // Reload Time
    weapon[1,6] = 1; // Shot Time
    weapon[1,7] = 5; // DMG
    weapon[1,8] = 15; // MAX DMG
    weapon[1,9] = 3; // Armor Penetration
    weapon[1,10] = "Test1"; // Name
    
    
    
    STEP:
    
    ammo = weapon[weaponh,1];
    maxammo = weapon[weaponh,2];
    mag = weapon[weaponh,3];
    maxmag = weapon[weaponh,4];
    reloadtime = weapon[weaponh,5];
    shottime = weapon[weaponh,6];
    dmg = weapon[weaponh,7];
    maxdmg = weapon[weaponh,8];
    armorp = weapon[weaponh,9];
    weapname = weapon[weaponh,10];

     

×
×
  • Dodaj nową pozycję...