Jump to content

NQ-Deckard

Staff
  • Posts

    239
  • Joined

  • Last visited

Everything posted by NQ-Deckard

  1. The PTS will be going offline soon in order to prepare it for its next update (no ETA yet), we want to thank all those who participated and provided feedback on the Docking and Boarding revamp and the warp changes. Thank you all for your support!
  2. The Dual Universe public test server (PTS) is reopening today with a preview of some of the improvements and additions that will make their way to the live server in a few weeks. Before we dive into these changes, we’ve got good news for you! A long-standing request from our community, this week’s PTS update includes a database refresh that mirrors the state of the live server from August 9. Players who created characters on or before that date will find them, and all their beautiful possessions, readily accessible. This should make your time on PTS more enjoyable. Players heading to the PTS today will be able to test the following main changes: The docking and boarding revamp revealed in this devblog. Several changes to the way warp drives operate. Optimized planet operations. … and many more bug fixes and tweaks which can be found here. We would greatly appreciate constructive feedback on the docking and warp drive features in particular. How well do the tools work? Is the interface user-friendly? How can we make them better? Your input now will help us get them in tip-top shape before they are integrated into the Live server. ABOUT THE TEST SERVER Please note that PTS is solely for testing purposes and may go offline at any time without prior notice. We’d like to manage expectations that PTS updates may include feature prototypes and gameplay changes that might not ever come to the Live server. On PTS, you’ll have some perks to help you speed up your progress and have an easier time getting the things you need: Dispensers that provide most items for free at the Alioth institute district (11) by the Arkship. A daily allowance of one billion quanta. Teleporters at the Market 1 of each major planet, allowing for free teleportation around the universe. For Alioth, the teleporter is located by the dispensers in the Institute District (11) by the Arkship. Three additional teleportation platforms are deployed in space on the edge of the PvP zones. Players can respec Talent points at-will. (By typing /respec in chat) Use of the Fetch feature with no limit of range or cooldown. Feedback and bug reports related to PTS should be posted in this designated forum, which we monitor closely as part of our commitment to improve the quality of the game and its performance.
  3. Attention asteroid hunters! Asteroid despawn and spawn times have been corrected. The current wave will despawn on Friday, August 13, at 15:00 UTC. The new wave will spawn on Saturday, August 14, at 09:00 UTC. Future waves will spawn on Saturdays.
  4. Hello Noveans, If not already enabled, I recommend enabling FPS Limitation in the graphical settings and monitor if the stability improves. We are actively looking into these issues, and would greatly appreciate support tickets for these issues with directx diagnostics. Thank you! ? DirectX Diagnostic instructions: Press the Windows-Key + R Type "dxdiag" and press OK In the new Window, select "Save All Information..." and attach it to a the ticket.
  5. We really want to hear your feedback on the Apollo (0.26) update, so discuss away!
  6. DUAL UNIVERSE APOLLO (0.26) UPDATE LAUNCHED Billionaires blasting into space has recently been a hot topic in the news. Luckily, for the rest of us whose bank balance doesn’t have a pretty little chorus line of zeros before the decimal, there’s Dual Universe to make our space exploration dreams come true. And those flights of fancy are even fancier with today’s launch of the Apollo (0.26) release. The update’s big-ticket items introduce new gameplay elements that will help scratch that itch for more quanta, resources, and pew-pew possibilities ASTEROIDS Using the new deep space asteroid tracker (DSAT), players will discover the locations of asteroids that can be mined for resources. Higher-tier, more valuable ore will spawn in dangerous PvP zones, increasing the chances for an exciting throwdown as players fight for ownership of the asteroid’s bounty. SHIELD GENERATORS Shields are the cornerstone in our first wave of PvP-related changes. Providing the first layer of protection during combat, shield generators are designed to absorb damage levied against dynamic constructs (i.e. ships). Future plans will bring shields into play for space core units (as found in static constructs), as well. Apollo also brings a cracking compendium of new gameplay elements and refinements including the first pass at weapons balancing and map improvements. Here’s a top-view of additional quality of life and beautification highlights within the update. NEW ASSETS Apollo (0.26) holds a builder’s bonanza with new elements and skins, including a chair surface element that will transform your construct’s aesthetically pleasing accent chairs into fully functioning ones. We’ve also added numerous weapon models and skins in a selection of different looks and sizes, some of which are pictured above. (From left to right: Missile Launcher M - Precision, Shield Generator S, Gunner Seat L, Missile Launcher L - Defense.) Many of these new features and improvements were pledged in The Future of DU, Part 3: Finding the Fun. This is our second major update in the three months since the blog series. Our commitment to following through will continue with our next release, Demeter, currently in development. Watch for more news and devblogs about Demeter in the coming weeks. For now, we hope our fellow Noveans will enjoy all that Apollo has to offer. Join the conversation and share your feedback with us on the forum.
  7. Hello Noveans! We really want to hear your feedback and concerns on the upcoming PvP changes, please give us constructive feedback on both what you like and dislike.
  8. Okay, PvPers, this one’s for you! As foretold in The Future of Dual Universe Part 3: Finding the Fun and the recently-published 2021 roadmap, we’re adding some new toys to your arsenal and making some of the existing toys even better. These changes will come over time and in waves. Here’s what you can expect in the first pass as part of the Apollo (0.26) update, now available on our public test server. New PvP element: Shield generators Shield generators serve as the first layer of protection for dynamic constructs during combat. Shields will absorb damage until depleted, at which point they will stay depleted until the end of combat as defined by the combat timer. Future plans will bring shields into play for space core units, but for now, they will only be available on dynamic constructs. These elements come in sizes XS through L with different shield strengths respective to their size and are not restricted to core sizes. This is the V1 technical phase of introducing shields, making sure that the foundation is solid before more bells and whistles are added. Honeycomb Health Points Adjustments to honeycomb HP--rebalanced and significantly reduced--have been done in the context of the implementation of shields and the weapons rebalance. With these changes, we should see a general reduction in fight duration with a faster time to construct destruction (TTCD). Specifically, gold has been brought back in line. While still technically the highest HP honeycomb, it will now come at a serious mass cost compared to other options. This should open new options in honeycomb selection when building ships and reduce the feeling of “gold or nothing” players may currently sometimes feel. Weapons adjustments We found that the disparity between the smallest and largest weapons DPS was too great. This made it difficult to justify using anything other than L weapons. While L weapons previously did roughly eight times more damage than XS weapons, they will now only do just under three times more damage than their smallest cousins. Revised damage per second: XS weapons: On average, extra small weaponry will do 2.5 to 3 times more DPS. S weapons: On average, small weaponry will do 1.75 to 2 times more DPS. M weapons: On average, medium weaponry will do 1.5 times more DPS. L weapons: On average, large weaponry will do about the same DPS. In regards to DPS, larger weapons of the same type will take more time to cycle, allowing larger weapons to keep hitting hard per round, at the cost of rate of fire. Lastly, adjustments have been made on various other parameters, such as reload times and weapon capacity, to help balance overall damage output, and how it feels to use. We hope this brings more diversity to the offensive options you have when building ships and allowing more space for smaller ships and weapons. Cones Weapon cones’ optimal and falloff values have been augmented by about three times (with the exception of missiles). This change was based on feedback from the community who said that weapon cones felt too limiting and restricted flexibility when designing ships. We hope this allows more options when placing different weapon types, having more weapons that approach similar levels of flexibility to missiles with weapons like lasers and cannons having a much wider range of operation. Railguns will remain relatively limited as a heavy sniping platform but will still enjoy more cone than before. Tracking Tracking on weapons is the ability to reliably track and hit targets. Weapons with improved tracking will generally have better chances of hitting targets, especially smaller and faster ones. There was always an intention that smaller ships should be able to evade damage from larger guns. In practice, this was not the case as L-based ships easily dispatched smaller constructs at various ranges. To help correct this, tracking has been significantly decreased across the board by about half on every weapon. These initial adjustments will help, but likely not suffice in helping smaller ships survive combat engagements. We will continue to look at other options for further iteration in future updates and already have plans on the subject. As a parting comment on weapon balance, please note that this is more of a global rebalance to address macro issues we had across the board to set a healthier base. Expect more specific adjustments to come later for specific weapon changing and balancing as more PVP-focused releases are done in the future. Opinions Wanted As noted above, and in nearly all of our communications, player feedback is always welcomed and encouraged. Particularly as these changes are on PTS where you can experience them first-hand, your opinions go a long way in helping us make needed adjustments before Apollo (0.26) debuts on the live server. Please take a moment to share your thoughts in this thread.
  9. Effective immediately as the deployment of the docking update is pending, the boarding of other players' constructs without consent will be considered an exploit. Offenders will be teleported away; repeat offenders may be subject to more serious repercussions. If you are boarded by another player and wish to have them removed, please report it either by creating a ticket here or by messaging @gm through the in-game Help channel.
  10. Hello Noveans! We really want to hear your feedback on the Asteroid Devblog, so please discuss away!
  11. ALL ABOUT ASTEROIDS Ahh, those crunchy little rock nuggets, filled with fabulous sweet surprises. *nom nom nom* Okay, so they aren’t so little, and they probably aren’t all that delicious, but those sweet surprises are very, very real. Some say they smell like quanta. Let’s take a look at asteroids, one of the key features coming in Apollo (0.26), now available on the public test server. What are they? What’s in them? How do you find them? How will they impact the gameplay of Dual Universe? WHAT ASTEROIDS ARE, WHAT THEY HOLD Asteroids are small, temporary celestial bodies. You will be able to track, discover, and mine them. They respawn in dispersed batches weekly, and asteroids in each batch will initially spawn over the first 24 hours. The addition of asteroids will bring some spicy elements to gameplay as they provide a real incentive for PvP other than mere pirating (not that there’s anything wrong with that if that’s your thing). Another upside is that locating and mining asteroids, along with transporting their bounty, will encourage cooperation and interaction between different groups of players. One can never have too many friends, right? At the end of the life cycle of these asteroids, they will be despawned, to make way for a new batch to spawn. For testing purposes, this is set to one week but is subject to change based on community feedback. And, last but not least, it’s always good to have another way to acquire resources. Asteroids are also more resource-rich than your average mining territory. The ore they contain is of varying tiers, depending on the area in which they are discovered. Higher tier ore will be found in the more dangerous PvP zones. The greater the risk, the higher the reward. HOW TO FIND THEM Although it is technically possible to discover an asteroid as you’re roaming around in space, it’s more likely that you’ll need some mechanical assistance. Say hello to the deep space asteroid tracker (DSAT). It serves two general purposes: to display all existing asteroids in the system, regardless of their state, and to track undiscovered asteroids. Once an asteroid is discovered, you’ll use the DSAT to set a series of waypoints to it. The DSAT display panel shows: Rumored: Asteroids that exist but have not been discovered. Discovered: Asteroids that have been successfully discovered. Broadcast: The shared location of discovered asteroids. Discovered countdown timer: The length of time remaining before broadcasting the location of a discovered asteroid. Scan: Click to begin scanning for an asteroid’s location. Information about the specific asteroid being scanned is displayed in the box above. The Rarity field shows the type of ore you will find there, ranging from Basic, Uncommon, Advanced, Rare and Exotic. From there, you can select an asteroid to track. The DSAT will ask you to scan several information points in the target area in order to zero in on the final location of the asteroid. These information points are unique for each player; sharing them won’t enable anyone else to speed through the scanning process. Once you have reached and scanned all the information points, the location of the asteroid will be revealed. When someone touches down on the asteroid, the time starts ticking. In four hours, the location will be revealed in the Broadcast section of the DSAT display, visible to anyone with a DSAT unit. (Important note: The four-hour time limit is subject to change based on testing results and player feedback.) DIG IN Good news for the lone wolves of the world: Single-player asteroid-hunting is completely feasible. It is about picking the right amount of risk and having a well-designed ship for dig-and-run action. A major perk of being the first to discover and begin mining an asteroid is that you’re pretty much guaranteed to pull out a few nodes of higher-tier-ore from the get-go. A tier-3 asteroid might contain a couple of tier-5 veins. How long it will take to fully deplete all of the asteroid’s resources depends on a wide range of variables. How large is the crew? How good are they at working together? What equipment are they using? A well-oiled machine of a team with top-line equipment has the potential to complete the task before the four-hour broadcast timer dings. (Potential being the operative word there.) A more likely scenario is that you’ll have competition. Being the first to successfully locate the asteroid doesn’t give you exclusive rights to it. Anyone else can scan and locate it, too, or stumble upon it out of sheer luck. SWITCHING THINGS UP Although the basic mining gameplay and mechanics are in place, a big change for miners is that asteroids have extremely low gravity and no atmosphere to speak of, giving you the option to mine and dig entirely in jetpack mode if you so choose. Another significant departure is that with asteroids having the potential to spawn in PvP zones, this will also be the first time players can mine and fight in the same general area. CHOICES With plenty of options related to asteroids, you’ve got some important choices to make. Is your sole business to find asteroids and sell the location information to others before they are publicly broadcasted? Will you stick to the safe zones and leave the dangerous resource gathering to others? Do you use the Job Forum to hire help to mine and transport ore? Will you scour the skies looking for miners to loot? These are simply a few possibilities. There are countless more, and endless stories of victory and defeat waiting to be told. What will your asteroid glory story be? Share it in the forums.
  12. Sample Scripts (Control Unit Interaction) These scripts show some simple examples of Control Units interacting with screen units. Light Control (Screen to Programming Board) This example demonstrates clickable buttons on a screen unit, that set the screens output to a value, the programming board reads that value and then clears it and toggles lights based on that data. (See the top section for the programming board code) --[[---------------------------------------------------------------------------- -- Add the following section to a programming boards System.Update() -- Link the screen unit and three lights to the programming board -- Name the slots in the programming board respectively: screen, light0, light1, light2 local handlers = {} handlers['Light 0'] = function() light0.toggle() end handlers['Light 1'] = function() light1.toggle() end handlers['Light 2'] = function() light2.toggle() end local output = screen.getScriptOutput() if #output > 0 then screen.clearScriptOutput() if handlers[output] then handlers[output]() end end --]]---------------------------------------------------------------------------- -- Screen render script below -------------------------------------------------------------------------------- font = loadFont('Play-Bold', 32) rx, ry = getResolution() cx, cy = getCursor() layer = createLayer() click = getCursorPressed() -------------------------------------------------------------------------------- if not Button then local mt = {} mt.__index = mt function Button (text, x, y) return setmetatable({ text = text, x = x, y = y, }, mt) end function mt:draw () local sx, sy = self:getSize() local x0 = self.x - sx/2 local y0 = self.y - sy/2 local x1 = x0 + sx local y1 = y0 + sy local r, g, b = 0.3, 0.7, 1.0 if cx >= x0 and cx <= x1 and cy >= y0 and cy <= y1 then r, g, b = 1.0, 0.0, 0.4 if click then setOutput(self.text) end end setNextShadow(layer, 64, r, g, b, 0.3) setNextFillColor(layer, 0.1, 0.1, 0.1, 1) setNextStrokeColor(layer, r, g, b, 1) setNextStrokeWidth(layer, 2) addBoxRounded(layer, self.x - sx/2, self.y - sy/2, sx, sy, 4) setNextFillColor(layer, 1, 1, 1, 1) setNextTextAlign(layer, AlignH_Center, AlignV_Middle) addText(layer, font, self.text, self.x, self.y) end function mt:getSize () local sx, sy = getTextBounds(font, self.text) return sx + 32, sy + 16 end function mt:setPos (x, y) self.x, self.y = x, y end end function drawFree (elems) for i, v in ipairs(elems) do v:draw() end end function drawListV (elems, x, y) for i, v in ipairs(elems) do local sx, sy = v:getSize() v:setPos(x, y) v:draw() y = y + sy + 4 end end function drawUsage () local font = loadFont('FiraMono', 16) setNextTextAlign(layer, AlignH_Center, AlignV_Top) addText(layer, font, "Activate board to enable buttons!", rx/2, ry - 32) end function drawCursor () if cx < 0 then return end addLine(layer, cx - 12, cy - 12, cx + 12, cy + 12) addLine(layer, cx + 12, cy - 12, cx - 12, cy + 12) end -------------------------------------------------------------------------------- local buttons = { Button('Light 0', 128, 90), Button('Light 1', 128, 290), Button('Light 2', 128, 490), } drawFree(buttons) drawUsage() drawCursor() requestAnimationFrame(5) Light Control (Screen to Programming Board) This allows you to create and use toggle buttons for boolean values, the examples flip not only their own state, but also the horizontally neighbouring toggle. --[[---------------------------------------------------------------------------- -- Add to programming board's unit.start() and connect it to this screen. local messages = { "Hi, I am a message!", "Yes hello this is Lua Screen.", "We love Pops the Hamster!", "WARNING: No warnings found.", "I am a screen unit.", "Are you enjoying this?", "Pending Screen Operations", "Lua Screen Units o/", "It is NOT NQ-Node\'s fault.", "Knock knock...", "Who's there?", "Ran out of Knock knock jokes.", "It is all NQ-Deckard\'s fault." } local message = messages[math.random(1, #messages)] local params = { message = message, testNumber = 1.337, testStr = 'hello I am a string', testTable = {x = 1, y = 0, k = {1, 2, 3, 4}}, } screen.setScriptInput(json.encode(params)) unit.exit() --]]---------------------------------------------------------------------------- -- Screen render script below -------------------------------------------------------------------------------- local json = require('dkjson') local params = json.decode(getInput()) or {} message = params.message or '[ no message ]' fontSize = params.fontSize or 64 color = params.color or {r=1.0,g=0,b=0.3} -------------------------------------------------------------------------------- local font = loadFont('Play-Bold', fontSize) local rx, ry = getResolution() local layer = createLayer() local cx, cy = getCursor() local sx, sy = getTextBounds(font, message) setDefaultStrokeColor(layer, Shape_Line, 1, 1, 1, 0.5) setNextShadow(layer, 64, color.r, color.g, color.b, 0.4) setNextFillColor(layer, color.r, color.g, color.b, 1.0) addBoxRounded(layer, (rx-sx-16)/2, (ry-sy-16)/2, sx+16, sy+16, 8) setNextFillColor(layer, 0, 0, 0, 1) setNextTextAlign(layer, AlignH_Center, AlignV_Middle) addText(layer, font, message, rx/2,ry/2) -------------------------------------------------------------------------------- local fontCache = {} function getFont (font, size) local k = font .. '_' .. tostring(size) if not fontCache[k] then fontCache[k] = loadFont(font, size) end return fontCache[k] end function drawUsage () local font = getFont('FiraMono', 16) setNextTextAlign(layer, AlignH_Center, AlignV_Top) addText(layer, font, "Activate for an exciting new message!", rx/2, ry - 32) end function drawCursor () if cx < 0 then return end if getCursorDown() then setDefaultShadow(layer, Shape_Line, 32, color.r, color.g, color.b, 0.5) end addLine(layer, cx - 12, cy - 12, cx + 12, cy + 12) addLine(layer, cx + 12, cy - 12, cx - 12, cy + 12) end function prettyStr (x) if type(x) == 'table' then local elems = {} for k, v in pairs(x) do table.insert(elems, string.format('%s = %s', prettyStr(k), prettyStr(v))) end return string.format('{%s}', table.concat(elems, ', ')) else return tostring(x) end end function drawParams () local font = getFont('RobotoMono', 11) setNextTextAlign(layer, AlignH_Left, AlignV_Bottom) addText(layer, font, "Script Parameters", 16, 16) local y = 32 for k, v in pairs(params) do setNextTextAlign(layer, AlignH_Left, AlignV_Bottom) addText(layer, font, k .. ' = ' .. prettyStr(v), 24, y) y = y + 12 end end -------------------------------------------------------------------------------- drawUsage() drawCursor() drawParams() requestAnimationFrame(1)
  13. Sample Scripts (Widget Objects) These widget scripts show some examples of interactive UI elements created using the new Lua Screen Units. Sliders This allows you to create and use sliders for number values, the example handles change the color properties of background square. ------------------------------------ -- Slider widget example -- Usage: -- Creates a slider style widget with a minimum and maximum value. -- -- Init: -- widget = Slider(x,y,width,length,minValue,maxValue,defaultValue,label) -- Return fractional value of the slider position: -- widget:getFraction() -- Force set the value of the slider: -- widget:setValue(value) -- Draw the slider: -- widget:draw(layer) -- Return the value of slider: -- widget.value ------------------------------------ if not Slider then -- Object definition: Lets start by creating a meta table with some properties local slider = {} slider.__index = slider function Slider(x, y, width, length, min, max, defaultValue, label) self = {} self.x = x or 0 self.y = y or 0 self.l = length or 100 self.w = width or 20 self.min = min or 0 self.max = max or 1 self.value = math.max(self.min, math.min(self.max, defaultValue)) or self.min self.label = label or "" self.doDrag = false return setmetatable(self, slider) end -- example helper method that returns the position of the slider between a value of 0 and 1 function slider:getFraction() return (self.value - self.min) / (self.max - self.min) end -- example set method that allows us to set the value of the slider function slider:setValue(val) self.value = math.max(self.min, math.min(self.max, val)) end -- example draw method that draws the slider on the screen using the given layer and stored properties function slider:draw(layer) -- Collect some cursor data local cx, cy = getCursor() local cPressed = getCursorPressed() local cReleased = getCursorReleased() -- Determine if the handle for this slider was just clicked or released if cPressed and cx >= self.x and cx <= (self.x + self.w) and cy >= self.y + self.l - (self:getFraction() * self.l) and cy <= self.y + (self.w / 5) + self.l - (self:getFraction() * self.l) + (2 * self.w / 5) then self.doDrag = true elseif cReleased == true or cx == -1 then self.doDrag = false end -- If we are currently dragging the handle we should update the position and value of the slider. if self.doDrag then local vy = 1 - ((cy - self.y - self.w / 5) / self.l) self.value = math.max(self.min, math.min(self.max, self.min + ((self.max - self.min) * vy))) end -- Finaly lets draw the entire slider on the screen -- Draw the background vertical bar (You could change the color below this line, or make a property for it) setNextFillColor(layer, 0.5, 0.5, 1, 1) addBoxRounded(layer, self.x + (self.w / 2.5), self.y + self.w / 5, self.w / 5, self.l, math.min(self.w / 10, self.l / 10)) -- Draw the handle (You could change the color below this line, or make a property for it) setNextFillColor(layer, 0.7, 0.7, 1, 1) addBoxRounded(layer, self.x, self.y + self.l - (self:getFraction() * self.l), self.w, self.w / 2.5, self.w / 10) -- Lets load a font for this slider, if you want lots of sliders, you may want to load the font outside this object to avoid to many fonts. local font = loadFont("Montserrat", self.w / 5) -- Fetch the dimensions of the label and value we are about to draw local lw,lh = getTextBounds(font, self.label) local vw,vh = getTextBounds(font, math.floor(self.value * 100) * 0.01) -- draw the label above the slider addText(layer, font, self.label, self.x + (self.w / 2) - (lw / 2), self.y - (lh * 0.5)) -- draw the value on the handle setNextFillColor(layer, 0.1, 0.1, 0.1, 1) addText(layer, font, math.floor(self.value * 100) * 0.01, self.x + (self.w / 2) - (vw / 2), self.y + self.l - (self:getFraction() * self.l) + (self.w / 5) + (vh / 2)) end end ------------------------------------ -- Display ------------------------------------ -- Collect the screen resolution for positioning local rx, ry = getResolution() -- Create two layers, one for the background square, the other for the sliders local backgroundLayer = createLayer() local sliderLayer = createLayer() -- Run this portion only once on screen startup, this creates the slider objects if not init then init = true sliderRed = Slider(rx/5-25, ry/8,50, ry/8*6, 0, 1, 0.2, "Red") sliderGreen = Slider(rx/5*2-25, ry/8,50, ry/8*6, 0, 1, 0.4, "Green") sliderBlue = Slider(rx/5*3-25, ry/8,50, ry/8*6, 0, 1, 0.6, "Blue") sliderAlpha = Slider(rx/5*4-25, ry/8,50, ry/8*6, 0, 1, 0.8, "Alpha") end -- every frame, draw the 4 slider sliderRed:draw(sliderLayer) sliderGreen:draw(sliderLayer) sliderBlue:draw(sliderLayer) sliderAlpha:draw(sliderLayer) -- every frame, draw the background square using the slider values as colour properties for the fill setNextFillColor(backgroundLayer, sliderRed.value, sliderGreen.value, sliderBlue.value, sliderAlpha.value) addBoxRounded(backgroundLayer,25,25,rx-50,ry-50,20) -- render cost profiler if true then local layer = createLayer() local font = loadFont('Play-Bold', 14) setNextFillColor(layer, 1, 1, 1, 1) addText(layer, font, string.format('render cost : %d / %d', getRenderCost(), getRenderCostMax()), 8, 16) end -- refresh the screen at a high rate to keep the slider elements responsive requestAnimationFrame(1) Toggle buttons This allows you to create and use toggle buttons for boolean values, the examples flip not only their own state, but also the horizontally neighbouring toggle. ------------------------------------ -- Toggle widget example -- Usage: -- Creates a toggle button style widget with a true or false state. -- -- Init: -- widget = Toggle(x, y, width, height, defaultState, label, font, onClick) -- onClick can be a function that is executed when the button is clicked. -- Draw the slider: -- widget:draw(layer) -- Return the value of slider: -- widget:getState() -- or -- widget.state -- Set the state of the toggle: -- widget:setState(boolean) -- Switch the state of the toggle: -- widget:switch() -- Also returns the new state of the widget ------------------------------------ if not Toggle then -- Object definition: Lets start by creating a meta table with some properties local toggle = {} toggle.__index = toggle function Toggle(x, y, width, height, defaultState, label, font, onClick) self = {} self.x = x or 0 self.y = y or 0 self.h = height or 20 self.w = width or 20 self.state = defaultState or false self.label = label or "" self.onClick = onClick self.font = font or function() return loadFont("Montserrat",self.h * 5.5) end return setmetatable(self, toggle) end -- create a function that creates a new font if required, otherwise returns the font identifier from the properties local function getFont() local font = self.font if type(font) == "function" then font = self.font() end return font end -- draw method that draws the toggle on the screen unit function toggle:draw(layer) -- Collect cursor coordinates local cx, cy = getCursor() -- check if the mouse is over the button if cx >= self.x and cx <= self.x + self.w and cy >= self.y and cy <= self.y + self.h then -- handle the click action if getCursorReleased() then self.state = not self.state if self.onClick ~= nil then self.onClick() end end -- set the mouseover colors if self.state and getCursorDown() then setNextFillColor(layer, 1, 0.6, 0.8, 1) elseif getCursorDown() then setNextFillColor(layer, 0.6, 1, 0.8, 1) elseif self.state then setNextFillColor(layer, 1, 0.2, 0.2, 1) else setNextFillColor(layer, 0.2, 0.8, 0.2, 1) end elseif self.state then -- set color if toggle is true setNextFillColor(layer, 0.2, 0.2, 0.6, 1) else -- set color if toggle is false setNextFillColor(layer, 0.2, 0.2, 0.2, 1) end -- draw the button toggle local w, h = self:getBounds() addBox(layer, self.x, self.y + (h / 2 - self.h / 2), self.w, self.h) setNextTextAlign(layer, AlignH_Left, AlignV_Middle) addText(layer, getFont(), self.label, self.x + self.w + (self.w / 5), self.y + (h / 2)) end -- simple example helper method that returns the current state of the toggle function toggle:getState() return self.state end -- simple example helper method that sets the state of the toggle function toggle:setState(newState) if type(newState) == "boolean" then self.state = newState end end -- simple example helper method that changes and returns the new state of the toggle function toggle:switch() self.state = not self.state return self.state end -- helper method that returns the width and height of toggle function toggle:getBounds() local tx, ty = getTextBounds(getFont(),self.label) return self.x + self.w + (self.w / 5) + tx, math.max(self.h, ty) end end ---------------------------------------------------- -- Display ---------------------------------------------------- -- Collect the screen resolution for positioning local rx,ry = getResolution() -- Create a layer to draw the toggles local exampleLayer = createLayer() -- Create a font for all the toggles local font = loadFont("Montserrat", 20) -- Run this portion only once on screen startup, this creates the toggle objects if not init then init = true example1 = Toggle(rx / 7, ry / 5 - rx / 40, rx / 20, rx / 20, true, "Example Toggle 1 (Linked)", font) example2 = Toggle(rx / 7, ry / 5 * 2 - rx / 40, rx / 20, rx / 20, false, "Example Toggle 2 (Linked)", font) example3 = Toggle(rx / 7, ry / 5 * 3 - rx / 40, rx / 20, rx / 20, true, "Example Toggle 3", font) example4 = Toggle(rx / 7, ry / 5 * 4 - rx / 40, rx / 20, rx / 20, false, "Example Toggle 4", font) exampleA = Toggle(rx / 7 * 4, ry / 5 - rx / 40, rx / 20, rx / 20, false, "Example Toggle A (Linked)", font) exampleB = Toggle(rx / 7 * 4, ry / 5 * 2 - rx / 40, rx / 20, rx / 20, true, "Example Toggle B (Linked)", font) exampleC = Toggle(rx / 7 * 4, ry / 5 * 3 - rx / 40, rx / 20, rx / 20, false, "Example Toggle C", font) exampleD = Toggle(rx / 7 * 4, ry / 5 * 4 - rx / 40, rx / 20, rx / 20, true, "Example Toggle D", font) end -- for toggle, make the toggle next to it always the opposite and then draw the toggle example1:setState(not exampleA:getState()) example1:draw(exampleLayer) example2:setState(not exampleB:getState()) example2:draw(exampleLayer) example3:draw(exampleLayer) example4:draw(exampleLayer) exampleA:setState(not example1:getState()) exampleA:draw(exampleLayer) exampleB:setState(not example2:getState()) exampleB:draw(exampleLayer) exampleC:draw(exampleLayer) exampleD:draw(exampleLayer) -- render cost profiler if true then local layer = createLayer() local font = loadFont('Play-Bold', 14) setNextFillColor(layer, 1, 1, 1, 1) addText(layer, font, string.format('render cost : %d / %d', getRenderCost(), getRenderCostMax()), 8, 16) end -- Refresh the screen requestAnimationFrame(1)
  14. The public test server (PTS) is now available for all active DU subscribers with the Apollo (0.26) update. The changelog is massive, with lots of great new stuff and changes. We highly recommend reading through them as you enjoy your favorite snacks and beverages. They can be found here on the PTS forums. Your account login information is the same for both the Live server and PTS; however, access to PTS requires downloading, installing, and running a separate client. Please note that PTS is solely for testing purposes and may go offline at any time without prior notice. Feedback and bug reports related to PTS should be posted in this designated forum. A number of things available for you to try out, help us test, and provide feedback on are: Asteroids PvP Shields Combat Timers Updated Lua Screen Units PvP Rebalancing Map Improvements Lua Screen Documentation is not available in the Codex yet, however detailed information can be found here on the PTS forum.
  15. Reminiscent of the gargantuan splendor that was the Colossus of Rhodes, these demon and angel statues were created by members of the Dual Universe community. The demon, built by Armorize, stands at a whopping 64m. It was built using a dynamic M core to facilitate moving the piece, though it does not have flight capabilities. You can introduce yourself to this man of wealth and taste at ::pos{0,2,6.6075,80.3636,104.1866}. B4nd1t is a member of the Seraph Design Studio organization, whose ship design concepts center around angels. He and his colleague Shade0 spent an estimated 40+ hours building the 60m angel to decorate the roof of their showroom. To see this beauty on location, go to ::pos{0,2,19.8377,115.0273,102.9450}. Share your voxel art masterpieces with us! Send screenshots to creators@dualuniverse.com. Perhaps we’ll feature your creation in an upcoming video.
  16. Earlier this year, we presented our plans for the future of Dual Universe, following player feedback from the beta. Along with these plans, we had an internal roadmap, which we thought needed further refinement before being able to share it publicly, as we want to be able to give our community a reliable view of our plans. We now feel that this time has come, so here is the roadmap for the remainder of 2021. A few important things to note: This is a work in progress. Dates may shift. Features may be added or removed. Please also note that there is more further down the line, past 2021. We just want to be realistic about content and timings and start with delivering what we think is important for 2021. We hope to be working with you, our community, to deliver fun and interesting new features and improvements, thanks to our “new” release process, which includes the PTS, and to your ongoing feedback. Which features on the roadmap are you most excited about?
  17. We invited you to ask questions about 0.25 and 0.26 for a Q&A, and you did not disappoint! Here are the responses to some of the most commonly asked questions. The community also expressed curiosity about issues related to schematics and voxels. Those are both important topics that we think would be better served in separate, focused discussions. We’ll hit those for you soon. Big thanks to everyone who submitted questions. Let’s keep the conversation going! 1. Will the PTS receive a newer image when the next iteration comes through? Our most important consideration is to ensure better, smoother releases. (Can we agree that Hermes went pretty well?) Unfortunately, that means that migration to PTS is not on the priority list. Migrating the database from the live environment to the PTS requires a lot of work from our DevOps and Production teams, among others. These resources are scarce in the company, and, as usual, it’s about choices. We’d like to remind you, though, that playing on PTS comes with a lot of perks, such as dispensers with infinite resources, the ability to change skills at-will, millions of quanta, etc. 2. Are there going to be any changes to nerf the ability to use multiple alts with the hauling missions? We don’t currently have plans for that. We consider the cost of moving a package being the movement of the mass. You still need a bigger ship to move a larger amount of cargo. That said, we will consider the question of alts carefully for future mission types. 3. Will you be adding a way to identify which packages belong to which mission? This is a great suggestion! We definitely see how it would bring quality of life for mission-takers out there. It seems quite doable although it’s unlikely we can include it with Apollo (0.26) since that’s already underway internally and should come to the PTS soon; however, we’re in the process of discussing how we can add it to a future release. 4. Are org changes coming with 0.26? Following feedback from the community and discussions with some of the major org leaders, we announced this week that the org changes have been postponed. While we still need to address issues caused by nested organizations, we also want to make sure that we approach the changes in a collaborative manner with the players. With more options to consider and more conversations needed, it’s highly unlikely that these changes will come with the next major version, Apollo (0.26). 5. Will you please elaborate on what you mean by "PvP balance changes"? Will you be improving combat with smaller cores/stopping cube designs, etc., or just adding shields? We’ll share more details as the Apollo release date gets closer. To give you a little sneak peek now, we can say that overall it will feature weapons changes (including cosmetics), PvP-related bug fixes, the introduction of shields, and quite a few changes to the overall balancing of PvP. We would like to manage expectations by stating that this will be the first wave of changes and that we will have more heavy PvP-focused releases in the future. 6. Is passive mining coming before asteroid mining? Planet/passive mining is planned for the release after Apollo, codenamed Demeter. With Apollo, we are focusing on the introduction of asteroid hunting and mining gameplay. We’ll communicate more about it once Apollo is out of the way, but rest assured that these changes to mining are not too far in the future. 7. Do we get to have mining elements for ships? With Apollo, we will introduce one new element called the DSat scanner, which will be used to hunt down asteroids and discover their location. Mining itself will work as it currently does on planets though. More info on Apollo features coming soon. 8. Will asteroid mechanics still put a huge red arrow over your head by broadcasting the position through the universe, removing any need for PvPers to put effort into finding those who go out and find asteroids? To clarify, some asteroids will be in the PvP zone and some won’t. Asteroids in the PvP zone will have higher chances of including higher-tier ore and, as such, will be more valuable. But asteroids in safe zones should be worth your while, too. There will be a countdown between the time an asteroid is discovered by a player and the moment when its location is broadcast to other players. (Currently, the gap is four hours but this may change once we get feedback from players.) It shouldn’t be enough to completely deplete an asteroid of all its ore, but it should be enough to mine all the good stuff first. Once the location is publicized, it’s up to you if you want to stick around to finish mining the asteroid or move away before the pirates show up. We think this will provide interesting collaboration mechanics (mining while others protect the miners, for example) and, yes, additional PvP opportunities. We don’t think it will become an easy targeting system for pirates, though, as there’s no guarantee miners will still be on site by the time they arrive after learning of an asteroid location. 9. Will the asteroid system use the current land mining system, 400m manual scanner and hand-operated vein or will it be blocks of pure ore? Yes, asteroid mining will use mechanics similar to the current on-planet mining gameplay. Think of them as mini-planets with valuable ores.
  18. Following a lot of feedback from our players on the planned organization changes and discussions with our Game Design team, we have decided to postpone them. We would still like to address the issues related to the use of nested organizations, so we believe that changes to organizations will eventually have to happen; however, they may take on an altered form while still maintaining the same goals to provide a better structure for Dual Universe’s future. We are regrouping to decide how to address the issues and plan to present these changes to the community for additional feedback prior to implementing them. Stay tuned for more info. We hope this sets some minds at ease. Thank you for your feedback and support.
  19. A number of accounts have received warnings or bans today due to exploits related to Missions. While we will not comment further on those cases, it is a good time to remind the community: Don’t use exploits. (derr) Do not publicly accuse another player of exploiting. Instead, contact Support. We will investigate and take action as required. If you aren’t certain whether or not something could be considered an exploit, please don’t hesitate to contact Support to ask. It’s always better to be safe than sorry.
  20. On the heels of the announcement from Microsoft that Windows 11 is now in beta, we have begun testing its compatibility with Dual Universe. For those of you who are eager to see what the new OS has to offer, please keep in mind that we cannot currently guarantee compatibility with Dual Universe as the OS is still in beta and subject to ongoing changes. We will try to provide full compatibility as close as possible to the official launch of the OS in Q4 2021, though we can't give you an exact ETA until we've started testing properly with a final release version of Windows 11.
  21. Hello Noveans! We would like to take the opportunity to gather some questions from you regarding, 0.25 and 0.26 for an upcoming Q&A. The announcement can be found here. Ask away! - NQ-Deckard
  22. The three-part devblog series we published in April, “The Future of Dual Universe”, addressed the cost of doing business and our plans for the ramp-up to launch. We took the first steps in delivering on those changes in May with the incremental 0.25 updates, adding more gameplay content and improving both performance and visuals. Our 0.25 updates brought players: Voxel compression Constructs LOD Hauling Missions The Job Forum The first of a series of Challenges The integration of PopcornFX for visual effects And, of course, many bug fixes and additional improvements If you haven’t had time yet to check out these changes, we released some videos showcasing them. Watch this video for a closer look and missions and challenges and this first look at the new visual effects. About the latter, It was fun to watch the real-time reactions from our Twitch streamer community as they saw the changes for the first time. Now that 0.25 is wrapped up, development is underway for our next big milestone. Codenamed Apollo, the update centers around the first phase of a major mining revamp. The addition of asteroids will provide rare and precious ore, which in turn will create opportunities for conflict as the hunters become the hunted. To that end, PVP will receive a first wave of balancing changes and the introduction of shields. Keep an eye out for devblogs on these topics! In the meanwhile, we’d like to invite you to post your follow-up questions about the changes we introduced in 0.25 in this thread. In turn, we’ll take the best questions for an upcoming Q&A. Your insights and constructive feedback go a long way not only in helping us identify any lingering issues that should be addressed but are also helpful in how we can make things better in future updates.
  23. We recently introduced the first wave of an ongoing effort to enhance the visual effects (VFX) in Dual Universe, thanks to the integration of PopcornFX, a middleware solution for creating stunning particle effects. Players celebrated the difference when the first VFX improvements debuted as part of the 0.25.8 Hermes update on June 18th. This video showcases just some of the cool new effects, from ‘sparklier’ particle explosions to ‘glowier’ holograms. The Novaquark Art and Rendering teams took a few moments away from their visual ventures to talk a bit about the PopcornFX implementation and what it means for the DU community. Q: How will Dual Universe players benefit from the new visual effects? Our primary goals have been to improve immersion and increase the wow factor. Being an MMO, immersion is key, a layer of life added to our game. For that reason, we are always exploring different ways to improve graphics to make the world more believable and give it a sense of spectacle. Our new VFX are made with PopcornFX Editor. It gives us full control and makes it easy to experiment and iterate new versions that will improve the player experience. Q: Why did Novaquark choose PopcornFX? Dual Universe is being developed with Unigine, which we like since it allows us to do heavy modifications to achieve the desired results; however, those modifications have also prevented us from being able to benefit from Unigine’s latest visual improvements. PopcornFX is the perfect solution to fill that gap. It has exactly what we need technically for its implementation, top-notch visuals, and excellent performance results. (We promise they didn’t pay us to say this!) Q: Considering the proprietary technology behind DU, implementing off-the-shelf technologies can be tricky. What technical difficulties had to be overcome with this integration? It required several iterations and cross-team collaboration to ensure that integration was working properly so that it would be in an acceptable state for rollout to players. It first took the effort of the Rendering team to have the main pipeline working, from loading an effect file, launching the particle simulation, getting the buffer data back, and directing them to the right places and the right shaders. We’ve been able to build onto this and support more and more features requested by the Art team. We also worked with the Gameplay and Tool teams to supply a clean integration with variables from the game to provide a deep connection between the effects and the game itself by exposing all the parameters VFX artists can use. Q: Which VFX are we currently focusing on and what is the roll-out plan for future VFX updates? Our most recent update, Hermes, included a long list of our first PopcornFX-generated graphics. Tools: harvest, mining, directional detector, scanners, deploy ground element, refuel, maneuver, flatten, build mode tools. Industries: assembly lines, refiners, electronics, chemical, refiner, glass furnace, smelter, honeycomb refiner, printer, metalwork. Decorative constructs: plants, holograms. Miscellaneous: Arkship effects, elevators, an element explosion. Our goal regarding VFX is to apply them in almost every aspect of the game; sometimes they may be quite noticeable and others may be so subtle they are almost imperceivable. The layering is what adds that necessary depth of flavor to be well-rounded. We will continue to introduce new VFX to enhance the gameplay experience, for example the piloting experience and the PVP experience, and to breathe more life into some older elements that need it while introducing new elements along the way, too. We’ll also give some motion to the HUD and our complex interface that we know can really improve the immersion. Q: In addition to the VFX improvements, what other visual enhancements can players look for in the coming months? Since we began using PopcornFX, we've been seeing the game world through a new lens, brainstorming the possibilities and prioritizing all the improvements we want to make. The stellar views within the universe will be even more stellar as our ‘biome beautification’ efforts continue. The compliments we’ve been receiving from the community have been inspiring and encouraged us to take DU’s visuals to the next level.
  24. Novaquark is pleased to announce its partnership with NVIDIA GeForce NOW to make Dual Universe as accessible as possible to our players. GeForce NOW is NVIDIA's cloud game streaming service that instantly transforms nearly any PC, Mac or Chromebook into a powerful PC gaming rig. If your PC specs are below the minimum requirements for DU, this is for you! Dual Universe has been thoroughly tested to ensure the experience is optimal on GeForce NOW. You can now play DU at its best, in all its graphical magnificence. To do so, you will first need a subscription to Dual Universe. Then, simply head to the GeForce NOW website. GeForce NOW offers two membership options: Free and Priority. Anyone can sign-up for a Free membership, and start playing instantly. If you would like to upgrade your membership to experience the best of GeForce NOW, including priority access to game servers and extended session lengths, you can upgrade to the GeForce NOW Priority membership. Dual Universe awaits you, Novean!
  25. We’re making some changes to the way organizations work. Currently, organizations can cascade within themselves thus making it possible to create a near-infinite multitude of sub-organizations. This poses a problem from both a design and cost perspective as it removes any form of scaling limit to the amount of constructs and organization that can be in the game. It also leaves the door open for various ways to circumvent limitations needed for balancing. These changes will address these issues as well as clear up a number of anomalies that are affecting some existing organizations. They will be included in the 0.26 update, which gives you more than a month to reorganize as needed. New regulations for organizations will be: Each organization must have a player as its super legate. An account can only be the super legate of one organization. Nested organizations will still be possible but will require a player as super legate of that organization, and that player cannot also be the super legate of the parent organization. To ensure a smooth transition and have things set up the way you prefer, we encourage you to restructure your org(s) accordingly. Organizations that have not been updated will undergo an automated modification process. This will be done in a prioritized order as described below. For players that are the super legate of multiple organizations: One organization will be selected as the player’s primary organization according to the following parameters: The number of players in the organization. The number of constructs in the organization. The age of the organization. The player will become a designated legate for any other orgs to which they belong. To address situations where an organization is nested within another so that there is no player designated as super legate, these are the solutions we’ll pursue: The legate with the most seniority that is not already a super legate of an organization and has connected over the past month at the time of the change is promoted to super legate. If no legates exist, the oldest member that is not already a super legate of an organization and has played within the past month at the time of the change is promoted to super legate. The oldest legate that is not already a super legate of an organization is promoted to super legate. The oldest member that is not already a super legate of an organization is promoted to super legate. If none of the above apply, the organization will be disbanded. Constructs and territories for any properly structured organizations or organizations that are assigned a new super legate will be unaffected and remain in ownership of that organization. The constructs and territories of disbanded orgs will be reassigned to the first former super legate in the chain of organization parenting. Any other construct will be abandoned, and territories will be unclaimed.
×
×
  • Create New...