-
Posts
815 -
Joined
Content Type
Blogs
Forums
Store
Gallery
Videos
Downloads
Everything posted by Alienhead
-
Ultimate Action Game Controller ( UAGC ) - WorkLogs
Alienhead posted a blog entry in Ultimate Action Game Controller
Ultimate Action Game Controller ( UAGC ) - One game controller for all situations. Ranged, melee, hand to hand, thrown and magic combat game controller. With UAGC, the developer can select from First-person, Third-Person, Top-Down and Point & Click game controller setups. Each mode features it's own unique style of gameplay made just for that particular gaming situation. The component is designed with ease-of-use in mind, just attach the component to your game player inside the editor and configure the options as you see fit. Slated release version is 1.0 ( current state is alpha ). I will keep a running log on updates and development notes within this blog. Concept born Started 3rd person mode Added Always Run toggle Added Numlock toggle run on/off Added console log, for messages being sent from controller to the game screen. Started State-Machine decision logic for later adaption. This will allow such things as fishing, climbing, swimming etc to be easily added to the controllers. Added a generic Skeleton with all the animations the controller will use, thus allowing the developer to bring in a Mixamo rigged character and simply retarget the animations to their own custom character. Added jump, double jump ( toggle ) and even triple Jump ( toggle, for action arcade style gaming ) . Added animations for double jump ( mid air ) and triple jump ( extreme in-air jump animation ). Added toggle for fall damage ( on or off ) Added animation for fall or jump - landing at high altitudes. *This product is an addon and requires Ultra Engine* Early adopter video. Back in the saddle after a little delay with squaring away UltraEngine ( thanks Josh for the help ). This update features a new Bolt-On component: ROPES ! Ropes are another means of climbing or gaining height on your play maps. The setup process could not be any easier. You simple create a Empty game object on your play map and Position it where you want a rope to hang. Then attach the uagc:Rope component to it and define your height and segments! The Controller builds the rope meshes on map load and the player controller interacts with any rope module it comes into contact with. How's that for easy setup? Features and Info on ropes: Ropes can be of any size, length or thickness Physics based rope segments Player can enter ropes from any location Player can exit ropes from any location. Player can exit rope and enter new ropes or other objects on the map. Definable rope speed for climbing and descending. New animation sequences added for rope climbing bringing the total to 63 animation seqs. AI enemy modules mapped out for rope climbing, yes those pesky mobs will be able to traverse by rope. Rope strength and weakness settings, give the player something to worry about! weak rope! Rope sounds for climbing and strength of Rope coming soon ( waiting on more Ultra fixes ) Event command can be sent to any rope to break it apart in mid or idle! Think of the possibilities. And a short demonstration with Ropes: I'm thinking about starting weapons next, at least get the foundation started for Range weapons ( rifles, machineguns etc.. ) then move on to melee, magic and unarmed. Still Alpha 2 - I'm back with a new addition to the UAGC, Ladders! This is the first bolt-on module created for UAGC so there was additional time needed to layout the system that will be used for many future bolt-on modules. This module is a part of the UAGC baseline package. Usage: The asset comes with 3 prefab ladders, they are very basic but dropping a prefab unto the map will allow you to change out the ladder mesh to your liking, just swap the prefab mesh with your desired mesh, or use the bolt-on ladders - it really don't matter. The prefab's are preconfigured so placing one on the map the Controller will automatically interact with it. Nothing to code or do on your side but to design your play map. Features : 3 completely ready to use prefab ladders, small - med. - large. Ability to customize ladder mesh to your liking. Customizable up and down ladder speed for simulations to arcade style play. Unlimited amount if ladders can be on a single map, including overlaps and 360 directional angles. Ladders aren't bound to a straight up down placement, rotate them anyway you see fit. Ladders are automatic, run the player into the ladder and he will automatically adapt to it ( no pressing USE or anything like most controllers.) Ladder climbing can be aborted but jumping off the ladder anytime you like. Pressing a directional key while jumping off a ladder will result in a jump in that direction from the ladder ( great for platformers ) . Ladders are automatically dismounted when reaching the top or climbing down to the bottom. Ladders can be of any size ( height ). Head tracking works on ladders! If there's nothing to track then the character will adjust his head to looking in an up or downward angle depending on the direction being traveled. Ladders support nav-mesh. ( later AI modules will be created to traverse enemies up and down ladders easily. Ladders don't have to be entered from the top or bottom only, jumping on any portion of the ladder mesh will force the controller to react. Numerous sync'd animations make up the motion needed to make ladder climbing seem more authentic. Configurable up and down climb speeds as well as animations speeds. Configurable start climbing delay, for that fine touch. Toggleable 'use run key' while on ladders ( for additional climb speeds ) Always RUN feature now works with ladder fast speed. Other Bolt-On modules planned - Mounts, riding, swimming, underwater swimming, diving, hang gliding, rock climbing, rope climbing, ledge and cliff hanging and a few more I'm thinking about but not decided on just yet. This past week saw a lot of mechanics added to the controller, really making way for what's to come. I can now easily add scenario's ( Modules ) and better control the modes the player is in. For example, say the player has died, a mode designated for death is triggered; inside this mode restrictions are applied; such as No Player Movement, Death Music.. etc..etc. I should be able to make unlimited amounts of modes as they are needed, I have also designated 100 slots for user-defined modes as well so making a scenario in a custom game should be no problem at all with a bit of Lua coding experience. I started a module for Mounts in this update, it is no where near complete yet, but the controller will eventually handle riding mounts, as long as the mount contains a set of specified animations then any mount model could be used. I'll provide a few mounts on release but downloading a mount ( animal ) and retargeting one of the skeletons I will provide - will make it painless to add just about any type of riding mount you can dream up. More on this later as I work out some details. Added master pivot, player meshes now follow the master pivot ( for better control and wider range of possibilities ( flying, underwater swimming etc.. )) Player mesh can now be lowered passed the master pivot to prevent 'floating on surfaces' as seen in nearly all game controllers. ( feet are planted more firmly on the ground ). Animations moved to the controllers new Animator Module ( handles all situations and picks the proper animation for whatever player mode is currently active) Implemented the 'Modes' module, this module will handle ALL game situations tossed at the controller and allows for easy expansion or even adding your own customizable game situations. Added a DebugCamera/Freeflight mode, hitting PageDown or a predefined key will exit the controller mode(s) and place the camera into free flight mode. You may toggle this feature off for distribution builds. You may define which key or key-combo invokes the free/debug mode. Added Footstep Sound controller , adjusts pitch per velocity of the players movement, smart switch turns off during non-footstep situations. Airborne etc.. etc.. Added ability to detect fall distance, so falling off a cliff is not the same as jumping and falling, fall distance is divided into soft landing, med landing and hard landing, each with their own animation and configurable sound effect as well as configurable damage to player. Double and triple jumps will not invoke the damage system unless jumping from a mountain top or building etc.. etc. or unless you turn on [x] All Fall Damage. Added more sound effects for jumping , soft landing and hard landing. Added LUNGE feature ( on/off toggle ). Controller can lunge forward with a tap of the forward KEY while initiating any jump. Lunges will not process if the player is simply falling off an object, a JUMP must be initiated in order to lunge forward. This feature can be toggled OFF if you so wish. Added Backflip, Frontfilp and Freefalling animation sequences, triggered in certain situations. Double jump must be initiated before 1000 millisecs() passes after the initial jump or else the controller will begin the free falling mode. ( this prevents cheating from jumping at HIGH altitudes then double jumping just before hitting the ground to save from a nasty landing.. ) Added 'Air Brakes' feature - If turned ON; during a jump; if the player isn't pressing the forward or backward directional keys then the decline in jump height is accelerated. ( makes for more precise landings ( arcade style ) at the cost of slightly less realism, feature can be turned ON/OFF) Jumps and fall heights are now measured in real-world feet ( ft. ). Accurate adjustments to limits like damage from falls, water dives and distance to ground can be better calculated now. Started implementing the Vitals Module, this module will handle predefined stats such as health, Stamina and mana points etc.. Added - Damage Module; damage adjusters for jump/landing and fall/landing can now be set to your liking. Damage adjusters work off precents%. Example: Defining a damage modifier JumpLandingHard = 25 would cost the player 25% of their total health when a hard landing from a jump occurs. etc.. More Damage modifiers for many other events coming soon. Added player UI interface, Health, Stamina and Mana bars, these can be turned ON/OFF. Player vitals can be accessed anywhere in your code via the class variables: player.curHealth, player.curStamina, player.curMana ( for those who wish to create their own UI ). This module was added for quick development stage, you may wish to create a custom UI using this template when your game project is finished Added configurable HOTKEY to Show UI / Hide UI. Default F12 will toggle the UI interface On or OFF. Added toggle for MALE / FEMALE player controller ( sounds the controller plays will base off gender, hurt, death, grunts etc.. ) Added toggle for sound play on TakingDamage event, 4 sounds can be defined and one will randomly play on 'taking damage'. ( start out sounds included in asset! ) Added RENEGENERATION Module. This module will allow you to define such things as Health regeneration per game tick, Stamina, Mana etc.. You can turn this feature off if you so choose. Each game tick ( measured in 3 second intervals ) the controller will regenerate 'x' amount of vitals as defined. Added 'Controlless Falls' toggle, you can now turn ON/OFF controlless fails. If true, when the controller falls 'x' amount of feet ( set by variable controllesFallFT) an out of control fall begins.. If false, then all falls are controllable and not subject to freefall. Controlless Fall distance can now be set in the settings; controllesFallFT = 30ft, when a fall proceeds this amount a 'freefall' event is fired. Also known as a ControllessFall. NOTE: ControllessFalls must be turned on before this value has any effect. Added turn-animations for Idle rotation of mouse, camera and player mesh. Added camera tilt left and tilt right on turning, also added camera head bobbing on running sequences. These can of course be toggled OFF if you so wish. Added Crawl/Crouch mode - default hotkey is 'C' but it's configurable if you wish to change it. Added Poi head tracking: Point of Interest head-tracking. Drop a Poi.componet on any object in your map (or multiple objects) and set a distance. The player controller will preform a head track on that POI location. I will add smoothing to this as soon as POINT/Rate is working. This is a great feature for such things as grabbing the players attention towards powerups, ammo boxes, signs or anything else you would like. You can even attach the component to an animated enemy for immersive head tracking durning combat situations. Pulling angle locations and limits on the headbone was more of a task than I originally thought it would be,. This was a tricky feature to get working and even more tricky to get looking right but it's in and working now!. Added Poi head tracking: Point of Interest head-tracking. Drop a Poi.componet on any object in your map (or multiple objects) and set a distance. The player controller will preform a head track on that POI location. I will add smoothing to this as soon as POINT/Rate is working. This is a great feature for such things as grabbing the players attention towards powerups, ammo boxes, signs or anything else you would like. You can even attach the component to an animated enemy for immersive head tracking during combat situations. Pulling angle locations and limits on the headbone was more of a task than I originally thought it would be,. This was a tricky feature to get working and even more tricky to get looking right but it's in and working now!. Added: Camera-Shake feature. Call [ player:ShakeCamera(duration, magnitude) ] anywhere within your code to shake the camera. Added: Head-tracking, if turned on the player meshes head will track the direction the controller is turning, in addition the head will also track Y-up and Y-down angles. Added: Bailout-Roll, if turned on - when player is falling or coming down from a high jump he/she will have a split second to hit <spacebar> ( or whatever the jump key is defined to ) to preform a bail-out - saving him/her from certain fall damage. This move must be performed inches from the ground. Added: Point of Interest head-tracking (Poi). Objects on the map can be defined as Poi-trackable and the player will look their direction when within range. Poi Object Tracking: Now detects the nearest Poi object to the player instead of the first matched condition in the table/list. Poi Object Tracking: Added "Collision On/Off" toggle. Bolt-On Module: Ladders completed. Player model will no longer rotate when laying flat on the ground ( due to a hard or controlless fall or whatever may had caused him to fall flat ) . Added smooth SLERP rotation to camera when entering a ladder. Introducing 'TAGS' - some of the lesser interactive objects don't require Components attached, but rather simply placing a TAG on the object in the Ultra editor. Added TAG: ( UAGC:Slider ) - this tag will induce the player controller into a slide while the player is within the bounding box of the specified item. Added TAG: (UAGC:Sleep) - this tag defines a bed or place where the player controller can sleep. Added TAG: (UAGC:Sit) - this tag defines a chair or a place where the player controller is allowed to sit. Added TAG: (UAGC:Slide) - this tag defines a zone where the player controller can slide across the surface. Added TAG: (UAGC:Lift) - this tag declares an object as an up/dn elevator. The object name field holds the Lift's ID and Lift Panel TAGS can be tied to the lift ID for operation. Unlimited amount of lifts supported. Two empty game objects declare the up location and down location. * detailed setup instructions inside the PDF * Added 'Safe-Fall' toggle, when on - no fall damage or fall animation/effects will occur from any height. ( mainly used for ( rogue class ) arcade or platformer sims ). Added a new Label system, turn this toggle on and labels will be displayed where ever a UAGC component or TAG is located on the play map. Two types of sit and sleep have been added, 1) Auto : player walks into the tagged object and a sleep or sit will occur, 2) Use : Player walks near the tagged object and a label 'Press [F] to use' will pop up, the action will occur when the player hit's the use key or he/she can simply walk away. Added Component: ROPE. Simply place a blank object onto the map, position it to your liking and place a Rope component on it, define the length of the rope you desire and the that's it. The controller will build a physics rope that the player controller can fully interact with. ( unlimited amount of ropes possible ). Added definable speeds for lifts and elevators Lifts can set to AUTO-RETURN to the top of bottom base or none at all. ( definable buy Millisecs() time in settings. ) Added vacuum view to tube surfing! Started some code for Light AI components so enemies will also be able to use the sliders and tube pipes. Started DOCUMENTION PDF file, the controller is starting to become more detailed so I thought best to begin the components API, installation and usage documentation. Update highlights include: Sit, Stand, Sliders, Surfing and Lifts/Elevators! -
Just add to this Josh, and hopefully this helps you in some way, ALL the mats in the Materials/Developers folder freeze the app on RUN as well but for one, the Grid01.mat does not hinder anything, all the others will apply just fine in the editor but pressing f5 the screen locks up as in the prior videos. Once I remove those materials then f5 works just fine.
-
A quick amendment to alpha 2, I've been working on this feature for a few days now but didn't feel good about including it the last alpha because I wasn't happy with it. After much trial and error I finally got it to do what I had envisioned at the start: player mesh head tracking! A toggle on/off and your players will track the direction of the controller, left, right up and down. Also I'm working on PoI tags, you can drop a PoI ( point of interest ) component on any object in your play map and when the player gets close to one of the tags he'll auto track it as well, assuming nothing else is happening that requires his attention. That will wrap it up for my alpha 2, back next week with a whole slew of new and fresh features!
-
I decided to go ahead and just make two videos showing you this as it happens. First, Posteffects, one or two of them load fine in the editor. The others just go black. None of them whatsoever work in Run mode, I even tried loading them with code. Just get app freezes. Next is Skecthfab or gltf, glb models in general. I cannot load a single one of them. I have tried about 15 different models across the internet and everyone of them lock up my game when I hit f5. Only way I can get any models to not lock up my run mode is to convert the fbx with leadwerks and import the mdl files. Hope this help ya some, I sure want it to be working.
-
Alpha 2 This past week saw a lot of mechanics added to the controller, really making way for what's to come. I can now easily add scenario's ( Modules ) and better control the modes the player is in. For example, say the player has died, a mode designated for death is triggered; inside this mode restrictions are applied; such as No Player Movement, Death Music.. etc..etc. I should be able to make unlimited amounts of modes as they are needed, I have also designated 100 slots for user-defined modes as well so making a scenario in a custom game should be no problem at all. I started a module for Mounts in this update, it is no where near complete yet, but the controller will eventually handle riding mounts, as long as the mount contains a set of specified animations then any mount model could be used. I'll provide a few mounts on release but downloading a mount ( animal ) and retargeting one of the skeletons I will provide - will make it painless to add just about any type of riding mount you can dream up. More on this later as I work out some details. Added master pivot, player meshes now follow the master pivot ( for better control and wider range of possibilities ( flying, underwater swimming etc.. )) Player mesh can now be lowered passed the master pivot to prevent 'floating on surfaces' as seen in nearly all game controllers. ( feet are planted more firmly on the ground ). Animations moved to the controllers new Animator Module ( handles all situations and picks the proper animation for whatever player mode is currently active) Implemented the 'Modes' module, this module will handle ALL game situations tossed at the controller and allows for easy expansion or even adding your own customizable game situations. Added a DebugCamera/Freeflight mode, hitting PageDown or a predefined key will exit the controller mode(s) and place the camera into free flight mode. You may toggle this feature off for distribution builds. You may define which key or key-combo invokes the free/debug mode. Added Footstep Sound controller , adjusts pitch per velocity of the players movement, smart switch turns off during non-footstep situations. Airborne etc.. etc.. Added ability to detect fall distance, so falling off a cliff is not the same as jumping and falling, fall distance is divided into soft landing, med landing and hard landing, each with their own animation and configurable sound effect as well as configurable damage to player. Double and triple jumps will not invoke the damage system unless jumping from a mountain top or building etc.. etc. or unless you turn on [x] All Fall Damage. Added more sound effects for jumping , soft landing and hard landing. Added LUNGE feature ( on/off toggle ). Controller can lunge forward with a tap of the forward KEY while initiating any jump. Lunges will not process if the player is simply falling off an object, a JUMP must be initiated in order to lunge forward. This feature can be toggled OFF if you so wish. Added Backflip, Frontfilp and Freefalling animation sequences, triggered in certain situations. Double jump must be initiated before 1000 millisecs() passes after the initial jump or else the controller will begin the free falling mode. ( this prevents cheating from jumping at HIGH altitudes then double jumping just before hitting the ground to save from a nasty landing.. ) Added 'Air Brakes' feature - If turned ON; during a jump; if the player isn't pressing the forward or backward directional keys then the decline in jump height is accelerated. ( makes for more precise landings ( arcade style ) at the cost of slightly less realism, feature can be turned ON/OFF) Jumps and fall heights are now measured in real-world feet ( ft. ). Accurate adjustments to limits like damage from falls, water dives and distance to ground can be better calculated now. Started implementing the Vitals Module, this module will handle predefined stats such as health, Stamina and mana points etc.. Added - Damage Module; damage adjusters for jump/landing and fall/landing can now be set to your liking. Damage adjusters work off precents%. Example: Defining a damage modifier JumpLandingHard = 25 would cost the player 25% of their total health when a hard landing from a jump occurs. etc.. More Damage modifiers for many other events coming soon. Added player UI interface, Health, Stamina and Mana bars, these can be turned ON/OFF. Player vitals can be accessed anywhere in your code via the class variables: player.curHealth, player.curStamina, player.curMana ( for those who wish to create their own UI ). This module was added for quick development stage, you may wish to create a custom UI using this template when your game project is finished Added configurable HOTKEY to Show UI / Hide UI. Default F12 will toggle the UI interface On or OFF. Added toggle for MALE / FEMALE player controller ( sounds the controller plays will base off gender, hurt, death, grunts etc.. ) Added toggle for sound play on TakingDamage event, 4 sounds can be defined and one will randomly play on 'taking damage'. ( start out sounds included in asset! ) Added RENEGENERATION Module. This module will allow you to define such things as Health regeneration per game tick, Stamina, Mana etc.. You can turn this feature off if you so choose. Each game tick ( measured in 3 second intervals ) the controller will regenerate 'x' amount of vitals as defined. Added 'Controlless Falls' toggle, you can now turn ON/OFF controlless falls. If true, when the controller falls 'x' amount of feet ( set by variable controllesFallFT) an out of control fall begins.. If false, then all falls are controllable and not subject to freefall. Controlless Fall distance can now be set in the settings; controllesFallFT = 30ft, when a fall proceeds this amount a 'freefall' event is fired. Also known as a ControllessFall. NOTE: ControllessFalls must be turned on before this value has any effect. Added turn-animations for Idle rotation of mouse, camera and player mesh. Added camera tilt left and tilt right on turning, also added camera head bobbing on running sequences. These can of course be toggled OFF if you so wish. Added Crawl/Crouch mode - default hotkey is 'C' but it's configurable if you wish to change it.
-
Ultimate Action Game Controller ( UAGC ) - One game controller for all situations. Ranged, melee, hand to hand, thrown and magic combat game controller. With UAGC, the developer can select from First-person, Third-Person, Top-Down and Point & Click game controller setups. Each mode features it's own unique style of gameplay made just for that particular gaming situation. The component is designed with ease-of-use in mind, just attach the component to your game player inside the editor and configure the options as you see fit. Follow the worklogs right up until release!
-
Works fine in C++ but in LUA it would seem only 27 unique sound files can be loaded, the 28th stops the runtime window from responding. Here's some sample code. sounds = {} for t=1, 28 do sounds[t] = LoadSound("https://raw.githubusercontent.com/UltraEngine/Documentation/master/Assets/Sound/notification.wav", LOAD_UNMANAGED ) end sounds[28]:Play()
-
How many unique sound files can be loaded? I seem to have hit a cap at 28. Trying to load the 28th sound clip freezes the app. For example: ( LUA ) sounds = {} for t=1, 28 do sounds[t] = LoadSound("https://raw.githubusercontent.com/UltraEngine/Documentation/master/Assets/Sound/notification.wav", LOAD_UNMANAGED ) end sounds[28]:Play()
-
Josh will you ever forgive me? Sorry about this post.. found the error.
-
Hmmm after investigating it further, it's just messed up somewhere.. I get random freezes when I attempt to turn the camera on it's z axis.. some values work.. others lock it up.. dunno.
-
Oh and to take that one step further, self.camera:Turn(0,0,0,true) hangs the app too. self.camera:Turn(0,0,.01,true) works.
-
Something not quite right with Entity:Turn My app kept hanging up and i couldn't figure out why, after a few hours of tracing where it was locking at I came to this. self.camera:Turn(0,0,2, true) I eventually got it to work with this work around local anum = Vec3(0,0,2) self.camera:Turn(anum, true)
-
No real code to show, but LUA seems to have no way to remove or delete a widget or interface. LUA dont allow SetParent(nil) on the widgets, tried that yesterday. Just errors out at runtime. Unreferenced widgetVar = nil never removes the widget.
- 1 reply
-
- 1
-
LUA dont allow SetParent(nil) on the widgets, tried that yesterday. Just errors out at runtime. Unreferenced widgetVar = nil never removes the widget. This seems to be something needing some attention I suppose.
-
Seriously?
-
( LUA ) What's the proper way to remove/delete a Textlabel widget ( or any other widget ) from an interface? Or even better yet remove an unused interface completely ? Tried setting it to nil and removing references but no good. All my attempts at it have failed.
-
If anyone else was looking for this info, the custom functions need to be defined in the json file. "inputs": "outputs": Look at the SlidingDoor example if you need further examples.
-
I'm wanting to write some custom functions inside a lua component. My question is what is the proper syntax for creating a custom function and more so how to define it and or call it? Example: UAGController = { blah blah } function UAGController:Start() UAGController:ScanMap() <--- this would be the custom function call end function UAGController:ScanMap() this is the custom function end
-
A quick cheat, but I'm certain theres a more proper way to do this. self.entity:SetInput(self.camera.rotation.y, movement.z, movement.x, jump, crouch) self.entity:SetRotation(0, self.camera.rotation.y + self.modelangle - 180, 0)
-
In leadwerks, the player controller physics collider had a physics angle assigned to it, for flipping the direction of the character. I haven't been able to duplicate this in Ultra yet, all my attempts at creating a controller with a custom player have resulted in my characters being backwards. Coming out of mixamo i don't have the ability to simply turn my axis in a modeling software. How to achieve this ? Would you suggest using a cube for the actual player physics and just have the player mesh tag along ( giving me the ability to rotate it 180 ) ??
-
Since I seem to be having problems that no one else has been reporting, I've decided to reinstall my copy of windows this morning. So far none of the BS I listed above has occurred.
-
Okay it's for sure something on your side, I started an entirely NEW project, loaded the start.ultra map, attempted to run it, hang - freeze - power boot.
-
Entering the slightest typo or a syntax error in lua code causes me a total system shutdown. I have to power boot the computer to get it back up ( everytime ) . Also some commands entered correctly cause a power boot on my computer as well.. Example:: When this code reaches the self.camera:Move() command my system hangs and I have to power restart to get it back up. ---->> Setup Camera self.camera = CreateCamera(self.entity:GetWorld()) self.camera:SetPosition(self.myPosition) self.camera:SetRotation(self.myRotation) self.camera:Move(0,0,-1)
-
- 1 reply
-
- 5
-
A little test I put together to see how much Geometry i could throw at UltraEngine before it started showing any slowdown. Well i completed the entire scene and UltraEngine was still pounding away, this is an amazing engine guys. I 100% suggest you check it out if your into game dev. https://www.ultraengine.com/
- 1 reply
-
- 6